• 【100题】第三十八 (天平称重、大输入流、去除重复URL)


    一,题目

           1.用天平(只能比较,不能称重)从一堆小球中找出其中唯一一个较轻的。使用x次天平,最多可以从y个小球中找出较轻的那个,求yx的关系式

           2.有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入流中随机取得m个记录
           3.
    大量的URL字符串,如何从中去除重复的,优化时间空间复杂度


    二,分析


           1.  y=3^x
           2.
    每次输入一个记录时,随机产生一个01之间的随机数,用这些随机数维护一个大小为m的堆。
           3. 采用取模hash函数,找一个hash函数了,映射过去,采用链接法避免冲撞 ,如果A映射后的值A!=B,C,D...,把A加入链表,若相同,删除A,继续遍历


    三,重点解析第一题

            单元测试:三个球A B  C,称重A  B,A=B--> C为轻;A>B--->B为轻;A<B--->A为轻

            所以y取最大值,即每次刚好可以分三份。

            第一次  y/3

            第二次  (y/3)/3

            *

            *

           第x次  y/(3^x)=1

           所以y=3^x


    以下为网友给出的解答:


    每次将球分成三堆,尽可能让三堆球一样多或者让其中一堆多或者少一个。
    球数y和沉重次数x的关系是:
    y=1 =>
    x=0;(显然)
    y=2 =>
    x=1;(显然)
    y=3 =>
    x=2;(显然)
    如果y>3,也是将球分为三堆,记为A堆、B堆、C
    if y=3k
    k>1   
     
    称重一次,就可以判断瑕疵球在哪堆,从而使得球数降为k个;
    if y=3k+1
    k>=1假设C堆多放1球,A堆和B堆进行称重   
     
    称重一次,就可以判断瑕疵球在哪堆,
      if A == B
    ,瑕疵球在C堆,从而使得球数降为k+1个;
      else
    瑕疵球在轻的堆,从而使得球数降为k个;
    if y=3k-1
    k>=2假设C堆少放1球,A堆和B堆进行称重   
     
    称重一次,就可以判断瑕疵球在哪堆,
      if A == B
    ,瑕疵球在C堆,从而使得球数降为k个;
      else
    瑕疵球在轻的堆,从而使得球数降为k-1个;

    利用以上过程反复,可得结果。
    最后的次数x =log3y),可能在y哪里还需要做点什么修正。但复杂度就是log y


  • 相关阅读:
    sp_executesql 带输出参数的 EXEC 动态执行 (z)
    查端口是否被占用 DOS 命令netstat(Z)
    MS SQL处理树型结构数据 将子节点记录的各项字段值累加赋值给其父节点
    lazarus unidac使用注意事项
    UNIDAC在arm linux运行出错的解决方法
    [转]为Linux下的Lazarus添加中文输入支持
    银河麒麟(aarch64)安装Lazarus步骤
    raspberry 添加拼音五笔输入法
    lazarus跨平台编译步骤
    拷贝构造函数与赋值操作符的具体实现 【转】参考度4.5星
  • 原文地址:https://www.cnblogs.com/secbook/p/2655003.html
Copyright © 2020-2023  润新知