【发布时间】:2011-12-13 06:25:48
【问题描述】:
我需要比较非常大的基于文件的等长字符串以获得简单的相等性,而无需先计算哈希。
我想使用字符串中的数据进行看似随机的大跳跃,以便即使在开头和结尾方式相同的字符串中,我也可以快速确定不等式测试。也就是说,我想在整个范围内跳跃,以某种方式大部分或完全避免多次击中同一个角色。
由于字符串是基于文件的并且非常大,我不希望我的跳转太大,因为这会破坏磁盘。
在我的程序中,字符串是由文件支持的简单字符序列,大小小于 2gig,但很少一次完全在内存中。
然后在尝试了一段时间后,我假设它们是相等的,我只是按顺序迭代。
我的字符串类变体都有一个 int length() 和 char charAt() 函数的基本接口,假设 java chars,通常但不总是 ascii。
任何想法, 安迪
【问题讨论】:
-
这些字符串有很长的公共前缀是否很常见?如果不是这样,仅从头到尾逐个字符进行比较可能比随机跳转更有效(节省您计算跳转偏移量,允许读取最佳大小的片段并最大限度地减少搜索)。
-
因此,如果字符串可能(但不一定)相等,您希望该方法返回 true。您不想从一开始就按顺序比较字符,因为 (1) 您假设字符串的开头和结尾是相同的,并且 (2) 您希望最坏情况下的时间性能明显快于 O(n)。但为什么它必须是随机的呢?
-
实际上,我认为这更像是一个统计问题而不是编程问题。您正在做的是从样本(您随机跳转到的字符)中推断总体(整个字符串)。
标签: java string algorithm hash