C 删除文件上重复的数字
我有一个二进制文件,上面有数百万个64位无符号整数。我需要的是删除文件上重复的数字。我的想法是在每个元素上创建一个哈希表,每个元素都有一个数字及其在文件中的位置,这样我可以搜索重复的数字,然后根据其位置删除它们 有什么更好的方法来实现这一点 [编辑]C 删除文件上重复的数字,c,file,duplicate-data,C,File,Duplicate Data,我有一个二进制文件,上面有数百万个64位无符号整数。我需要的是删除文件上重复的数字。我的想法是在每个元素上创建一个哈希表,每个元素都有一个数字及其在文件中的位置,这样我可以搜索重复的数字,然后根据其位置删除它们 有什么更好的方法来实现这一点 [编辑] 删除重复的数字并不意味着用0来回复它们,因为它的大小仍然是64位。因此,我认为有两种选择:或者重写整个文件,或者创建一个具有唯一编号的新文件,这意味着没有重复的编号。为什么不读取文件并计算读取的编号。如果是第一次写入新文件,则跳过此数字。为此目的:
删除重复的数字并不意味着用0来回复它们,因为它的大小仍然是64位。因此,我认为有两种选择:或者重写整个文件,或者创建一个具有唯一编号的新文件,这意味着没有重复的编号。为什么不读取文件并计算读取的编号。如果是第一次写入新文件,则跳过此数字。为此目的:
do
read a number
look for it in a table
if found then
skip
else
add to table
write to new file
endif
while !eof
您不需要比每个数字更多的信息。您不需要它的位置或散列信息。
您可以使用初始化为0(表示未找到)的malloc realloc int64“数组”,并使用读取的编号访问每个位置。首先对文件进行排序,然后在写入最终输出时消除重复项 编辑: 最好的办法是。它假设您已经有了一个较小大小的排序算法(使用快速排序或合并排序)和一个合并算法
如果你的文件可以放在ram内存中,你就不需要它了 你的问题不清楚。尝试添加更多详细信息“从文件中删除数字”是什么意思?是否要将它们替换为0?如果你真的想删除它们,那么你需要重新编写整个文件。如果你要移除它们,为什么要保留它们的位置?仅仅第一个数字的位置就够了吗?你必须删除所有重复数字的实例,还是必须保留第一个?@tioPepe,我需要保留第一个。这些数字有64位长,他必须有记忆。。。我想他没有。但是这个想法很好,我的意思是这是一个开始。你建议创建一个18446744073709551615大小的数组?这将占用2048 PB。这是因为我引用了“数组”。有一些解决方案像一个数组池,由数字mod X和数字%X索引。来吧,更多想法!!!在这种情况下,有一个简单的哈希表。即使没有哈希函数,它也具有相同的特性(固定大小、冲突策略等)。排序文件的最佳解决方案是什么?是的,我的文件适合ram内存,因此不需要外部排序。然后使用快速排序。。。无论采用何种算法,都要修改a和b的比较,以便在每次a=b时忽略一个值。