Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
Algorithm 查找存在的最大条目数的值_Algorithm_Search - Fatal编程技术网

Algorithm 查找存在的最大条目数的值

Algorithm 查找存在的最大条目数的值,algorithm,search,Algorithm,Search,我最近参加了一次面试。我被问到以下问题: 您有不同值的文本文件,每行一个。如何找到最大行数/条目数中存在的一个值 我将hashmap作为一个具有恒定时间复杂性的解决方案 然后面试官改变了问题,问如果文件有100亿行怎么办 现在我不能使用hashmap了。我想不出一个办法。 有人能提出一个办法吗 有没有办法将相同的项目分组在一起?根据hashvalue将所有值分成几个文件,然后对每个文件使用hashmap 和,时间复杂度是O(n)而不是O(1)根据hashvalue将所有值划分为几个文件,然后对每

我最近参加了一次面试。我被问到以下问题:

您有不同值的文本文件,每行一个。如何找到最大行数/条目数中存在的一个值

我将hashmap作为一个具有恒定时间复杂性的解决方案

然后面试官改变了问题,问如果文件有100亿行怎么办

现在我不能使用hashmap了。我想不出一个办法。 有人能提出一个办法吗


有没有办法将相同的项目分组在一起?

根据hashvalue将所有值分成几个文件,然后对每个文件使用hashmap


,时间复杂度是
O(n)
而不是
O(1)

根据hashvalue将所有值划分为几个文件,然后对每个文件使用hashmap


,时间复杂度是
O(n)
而不是
O(1)
您可以对文件排序,然后执行一次只需要O(1)内存的过程。

您可以对文件排序,然后执行一次只需要O(1)内存的过程。

如果值的范围限制为32位整数,一个简单的方法是保持一个由8位饱和计数器组成的4GiB阵列

  • 一次通过后,如果只有一个计数器命中255,则该值重复次数最多
  • 否则,记录饱和到255的所有计数器的值
  • 再次遍历该文件,仅更新所记录值的64位计数器。(忽略其他人)
您可以转换为在运行中使用更长的计数器,使其保持一次通过算法。255是计数器的sentinel值,这意味着您应该参考值的哈希映射->64位计数器

如果4GiB太多,您可以使用4位饱和计数器,但是更多的计数器将饱和,并且更新速度会较慢(尽管内存仍然是瓶颈,不管是否有额外的指令移位/屏蔽/与旧值重新组合)

使用多级方法(1位饱和计数器,然后是8位饱和计数器,…)没有意义,因为第一个之后的所有级别都必须是稀疏的(或者没有意义)。稀疏映射(如散列或树)的每项开销将取决于实际计数器的大小,因此在密集的第一级使用尽可能多的内存,然后在第二级使用64位计数器的散列映射


如果密集的计数器阵列根本不可行(例如,长数字) 在计数重复项时分批排序,然后合并这些批。例如,请参阅我对的回答,以获取有关如何在批处理时最大限度地提高效率的建议。这是针对字符串的,而不是整数,但类似于以良好的空间效率动态计算重复数的方法对数字字符串的效果甚至比对任意字符串的效果更好。基数Trie(节点可以表示字符串,而不仅仅是字符)对于这样一个小的字母表来说可能要麻烦得多


在任何情况下,如果进行排序,在写入批之前,都要对重复项进行计数,直到使用了尽可能多的可用内存。在第一次过程中发现和计数的每个重复项都是以后不必合并的。

如果值的范围限制为32位整数,一种简单的方法是保持一个由8位饱和计数器组成的4GiB阵列

  • 一次通过后,如果只有一个计数器命中255,则该值重复次数最多
  • 否则,记录饱和到255的所有计数器的值
  • 再次遍历该文件,仅更新所记录值的64位计数器。(忽略其他人)
您可以转换为在运行中使用更长的计数器,使其保持一次通过算法。255是计数器的sentinel值,这意味着您应该参考值的哈希映射->64位计数器

如果4GiB太多,您可以使用4位饱和计数器,但是更多的计数器将饱和,并且更新速度会较慢(尽管内存仍然是瓶颈,不管是否有额外的指令移位/屏蔽/与旧值重新组合)

使用多级方法(1位饱和计数器,然后是8位饱和计数器,…)没有意义,因为第一个之后的所有级别都必须是稀疏的(或者没有意义)。稀疏映射(如散列或树)的每项开销将取决于实际计数器的大小,因此在密集的第一级使用尽可能多的内存,然后在第二级使用64位计数器的散列映射


如果密集的计数器阵列根本不可行(例如,长数字) 在计数重复项时分批排序,然后合并这些批。例如,请参阅我对的回答,以获取有关如何在批处理时最大限度地提高效率的建议。这是针对字符串的,而不是整数,但类似于以良好的空间效率动态计算重复数的方法对数字字符串的效果甚至比对任意字符串的效果更好。基数Trie(节点可以表示字符串,而不仅仅是字符)对于这样一个小的字母表来说可能要麻烦得多


在任何情况下,如果进行排序,在写入批之前,都要对重复项进行计数,直到使用了尽可能多的可用内存。您在第一次过程中发现并计数的每个重复项都是以后不必合并的。

您可以根据前2或3位数字进行存储,而不必浪费时间进行散列。您不明白这个问题。问题是:如何找到出现次数最多的值?就像
1,2,3,4,5,1,4,1
,数字应该是
1
,因为有
1
。不,你第一次读对了。最大行数中存在的值。即重复次数最多的值。您可以根据前2或3位数字进行存储,而不是w