Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我在网上找到的一个有趣的谷歌面试算法需要线性时间_Java_Algorithm_Frequency - Fatal编程技术网

Java 我在网上找到的一个有趣的谷歌面试算法需要线性时间

Java 我在网上找到的一个有趣的谷歌面试算法需要线性时间,java,algorithm,frequency,Java,Algorithm,Frequency,所以我在网上找到了这个谷歌面试算法问题。这真的很有趣,我还没有想出一个好的解决方案。请看一看,并给我一个提示/解决方案,如果您能用Java编写代码就太好了:) “设计一种算法,给定数组中n个元素的列表,查找列表中出现n/3次以上的所有元素。 算法应在线性时间内运行。(n>=0) 您需要使用比较并获得线性时间。无散列/多余空间/且不使用标准线性时间确定性选择算法“提示:查看 更好的提示:首先考虑解决大多数问题。也就是说,尝试查找至少出现n/2次的元素。该算法的基本思想是,如果我们用与e不同的所有其

所以我在网上找到了这个谷歌面试算法问题。这真的很有趣,我还没有想出一个好的解决方案。请看一看,并给我一个提示/解决方案,如果您能用Java编写代码就太好了:)

“设计一种算法,给定数组中n个元素的列表,查找列表中出现n/3次以上的所有元素。 算法应在线性时间内运行。(n>=0) 您需要使用比较并获得线性时间。无散列/多余空间/且不使用标准线性时间确定性选择算法“

提示:查看

更好的提示:首先考虑解决大多数问题。也就是说,尝试查找至少出现
n/2次的元素。该算法的基本思想是,如果我们用与
e
不同的所有其他元素来抵消元素
e
的每次出现,那么
e
将一直存在,直到最后,如果它是多数元素

findCandidate(a[], size)
    //Initialize index and count of majority element
    maj_index = 0;
    count = 1;

    for i = 1 to n–1 {
      if a[maj_index] == a[i]
          count++;
      else
          count--;

      if count == 0 {
          maj_index = i;
          count = 1;
      }
    }
    return a[maj_index]
该算法循环遍历每个元素,并保持一个[maj_index]
的计数。如果下一个元素相同,则增加计数;如果下一个元素不相同,则减少计数;如果计数达到0,则将
主索引更改为当前元素,并将计数设置为1


接下来,您需要检查此元素是否确实发生了至少
n/2次,但这可以在一个过程中完成。

我的解决方案是受俄罗斯方块游戏的启发。 解决方案亮点(称为“Tetrise流程”): 使用三个键值对进行簿记,对元素设置键值,对元素的计数进行赋值。在主循环中,我们最多保留3个最新的不同元素。当所有三个键的计数均为非零时,我们将减少所有键的计数并消除零计数键(如果有)。最后,可能有也可能没有一些残余元素。这些是俄罗斯方块进程的幸存者。请注意,残余元素不得超过3个。如果没有留下任何内容,则返回null。否则,我们循环遍历原始的n个元素,计算这些剩余元素的数量,并返回那些计数大于n/3的元素

证据提示: 为了证明上述算法的正确性,请注意,对于一个元素,它必须在俄罗斯方块过程中幸存,或者保留在剩余部分中才能满足要求。为了了解原因,让我们将移除操作的数量表示为m,并将剩余元素的总数表示为r。那么我们有 n=3*m+r。 从这里我们得到m=0。
如果一个元素没有在Tetrise过程中幸存下来,它可能出现的最大次数是m
,不要使用标准的线性时间确定性选择算法说什么???我很想知道如果没有散列,人们会怎么做。尽管
int[]
也算作散列。它被认为是多余的空间。我无法立即想出一个确切的解决方案,但我确实相信有一个更为众所周知的问题,即通过迭代数组并使用技巧找到最流行的元素,然后再次查看数组以检查其出现的次数是否足够,从而找到所有出现次数超过n/2次的元素。如果重复该过程并忽略最流行的元素,则应该可以解决此问题,因为最多有两个元素出现超过n/3次,而三个元素出现超过n/4次,但修改起来很简单:好提示。还不确定如何应用于n/3,但知道算法肯定很棒。谢谢我们将利用这一点来尝试提出解决n/3的方案。但为什么这个问题被关闭了?我认为这是一个很好的问题,需要了解…@Newbie\u code我认为这是你表达问题的方式。一般来说,在这样的情况下,您应该自己解决问题,而不是要求社区为您编写代码。我投票决定重新打开它。@Newbie_code要获得
n/3
案例,请思考一下这个算法是如何工作的。概括起来并不太难,但我要提醒你,IMO最困难的部分是两个不同的元素可以工作。我把这个问题贴在这里只是因为我觉得它很有趣,也很难,我想把它分享给所有想讨论和知道如何解决它的人。用散列可以很容易地解决这个问题,但不使用它,而是在线性时间内?隐马尔可夫模型。。。我相信任何读过你答案的人都会学到一些东西,如果他们以前不知道的话。我对多数投票算法非常熟悉,但我不确定我在这里看到了如何适应它。正确性的证明依赖于一个引理,这个引理说你可以重新排列数组中的元素,这样你就可以以一种抵消所有其他元素的方式配对多数元素。如果你在寻找一个出现三分之一时间的元素,这个引理就失败了。你能更具体地说明一下你是如何推广算法的吗?OP要求报告列表中出现超过n/3次的所有元素。注意,俄罗斯方块算法不能确保所有剩余元素在列表中出现超过n/3次(在字符串“aadbbbabcc”上尝试;剩余元素是B和C,但B是唯一需要的元素)。因此,在俄罗斯方块过程结束后,您必须再次查看列表,计算每个剩余元素的出现次数(最多可以有2个剩余元素),然后检查频率是否超过n/3。谢天谢地,时间和空间的复杂性保持不变。您的键值对在技术上不是散列吗?问题说明不允许散列。不过,这是一个非常有创意的解决方案,值得赞扬,而不是吹毛求疵:)@HenleyChiu我不明白这种方法如何等同于散列。你能再解释一下吗?