【问题标题】:Hash a Sequence of positive/negative integers散列正/负整数序列
【发布时间】:2013-06-25 07:39:30
【问题描述】:

我有一个包含数百万行的文件(实际上它是一个在线数据流,这意味着我们正在逐行接收它),每一行由一个未排序的整数数组组成(正数和负数)没有每个数字的限制和长度不同,我们可能在一行中有重复的值,

我想删除 duplicate lines (如果 2 行具有相同的值,无论它们如何排序,我们认为它们是重复的),有没有好的散列函数?

我们希望在O(n) 中执行此操作,而n 是行数(我们可以假设每行中元素的最大可能数是恒定的,例如,我们每行最多有 100 个元素)

我已经阅读了 stackoverflow 中发布的一些问题,我也搜索了它,其中大多数是针对数组长度相同或整数为正数或偶数或已排序的情况,是否存在一般情况下有什么办法解决这个问题?

我的解决方案: 首先,我们使用O(n) 排序算法对每一行进行排序,例如Counting sort ,然后我们将它们放入一个字符串中,然后我们使用 md5 散列将它们放入一个哈希集中。如果它不在集合中,我们将其放入该集合中,如果它已经在列表中,我们检查具有相同哈希值的数组。

解决方案的问题:使用Counting Sort 进行排序会占用大量空间,因为数字没有限制并且可能发生冲突。

【问题讨论】:

    标签: hash hashmap hashcode


    【解决方案1】:

    对这么大的一组数据使用散列算法的问题在于,两条不同的行很有可能散列到相同的值。您想留在 O(n) 中,但我不确定这是否可行,需要数据的大小和准确性。如果你使用 heapsort,它是节省空间的,然后遍历新的排序数据,删除相同的连续行,你可以在 O(nlogn) 中完成此操作

    【讨论】:

    • 你的意思是对每一行进行堆排序?实际上数据并没有离线,它是一个online stream的数据,这意味着你不能对整个文件进行排序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2012-10-02
    • 2010-10-14
    • 2014-05-19
    • 2022-01-18
    • 2013-07-20
    • 1970-01-01
    相关资源
    最近更新 更多