Algorithm 查找存在的最大条目数的值
我最近参加了一次面试。我被问到以下问题: 您有不同值的文本文件,每行一个。如何找到最大行数/条目数中存在的一个值 我将hashmap作为一个具有恒定时间复杂性的解决方案 然后面试官改变了问题,问如果文件有100亿行怎么办 现在我不能使用hashmap了。我想不出一个办法。 有人能提出一个办法吗Algorithm 查找存在的最大条目数的值,algorithm,search,Algorithm,Search,我最近参加了一次面试。我被问到以下问题: 您有不同值的文本文件,每行一个。如何找到最大行数/条目数中存在的一个值 我将hashmap作为一个具有恒定时间复杂性的解决方案 然后面试官改变了问题,问如果文件有100亿行怎么办 现在我不能使用hashmap了。我想不出一个办法。 有人能提出一个办法吗 有没有办法将相同的项目分组在一起?根据hashvalue将所有值分成几个文件,然后对每个文件使用hashmap 和,时间复杂度是O(n)而不是O(1)根据hashvalue将所有值划分为几个文件,然后对每
有没有办法将相同的项目分组在一起?根据hashvalue将所有值分成几个文件,然后对每个文件使用hashmap
和,时间复杂度是
O(n)
而不是O(1)
根据hashvalue将所有值划分为几个文件,然后对每个文件使用hashmap
和,时间复杂度是
O(n)
而不是O(1)
您可以对文件排序,然后执行一次只需要O(1)内存的过程。您可以对文件排序,然后执行一次只需要O(1)内存的过程。如果值的范围限制为32位整数,一个简单的方法是保持一个由8位饱和计数器组成的4GiB阵列
- 一次通过后,如果只有一个计数器命中255,则该值重复次数最多
- 否则,记录饱和到255的所有计数器的值
- 再次遍历该文件,仅更新所记录值的64位计数器。(忽略其他人)
如果密集的计数器阵列根本不可行(例如,长数字) 在计数重复项时分批排序,然后合并这些批。例如,请参阅我对的回答,以获取有关如何在批处理时最大限度地提高效率的建议。这是针对字符串的,而不是整数,但类似于以良好的空间效率动态计算重复数的方法对数字字符串的效果甚至比对任意字符串的效果更好。基数Trie(节点可以表示字符串,而不仅仅是字符)对于这样一个小的字母表来说可能要麻烦得多
在任何情况下,如果进行排序,在写入批之前,都要对重复项进行计数,直到使用了尽可能多的可用内存。在第一次过程中发现和计数的每个重复项都是以后不必合并的。如果值的范围限制为32位整数,一种简单的方法是保持一个由8位饱和计数器组成的4GiB阵列
- 一次通过后,如果只有一个计数器命中255,则该值重复次数最多
- 否则,记录饱和到255的所有计数器的值
- 再次遍历该文件,仅更新所记录值的64位计数器。(忽略其他人)
如果密集的计数器阵列根本不可行(例如,长数字) 在计数重复项时分批排序,然后合并这些批。例如,请参阅我对的回答,以获取有关如何在批处理时最大限度地提高效率的建议。这是针对字符串的,而不是整数,但类似于以良好的空间效率动态计算重复数的方法对数字字符串的效果甚至比对任意字符串的效果更好。基数Trie(节点可以表示字符串,而不仅仅是字符)对于这样一个小的字母表来说可能要麻烦得多
在任何情况下,如果进行排序,在写入批之前,都要对重复项进行计数,直到使用了尽可能多的可用内存。您在第一次过程中发现并计数的每个重复项都是以后不必合并的。您可以根据前2或3位数字进行存储,而不必浪费时间进行散列。您不明白这个问题。问题是:如何找到出现次数最多的值?就像
1,2,3,4,5,1,4,1
,数字应该是1
,因为有1
。不,你第一次读对了。最大行数中存在的值。即重复次数最多的值。您可以根据前2或3位数字进行存储,而不是w