微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

rabin-karp 如何在可变长度分块中选择断点?

如何解决rabin-karp 如何在可变长度分块中选择断点?

我了解 rabin-karp 算法及其在字符串搜索中的用法。我不太明白的是它如何动态地将文件切成可变长度的块。 据说在每个字节偏移处计算一个小数据字节窗口(例如:48 个字节)的散列,并且块边界(称为断点)是散列的最后 N(例如:13)位为零的任何时候。这为您提供了 2^N = 2^13 = 8192 = 8 KB 的平均块大小。 问题:

  1. rabin-karp 滚动哈希是否从前 48 个字节开始,然后每次滚动一个字节。
  2. 如果是这样,即使使用简单的哈希函数,对于一个文件来说计算是否太多?
  3. 鉴于不可预测的数据,如何在大块大小限制内让 N 位散列为零?

解决方法

  1. 是的,滑动窗口是固定大小的,逐字节向前移动。
  2. 哈希函数的复杂度为 O(n),在每一步中它只添加(并且可能移位)下一个字节并减去窗口中的原始第一个字节,这是 Rabin 哈希的核心方法。
  3. 这实际上取决于哈希函数。卡盘尺寸的分布可能不同。为了减少块大小的可变性,提出了 the Two Thresholds,Two Divisors Algorithm (TTTD)。您还可以从学术研究论文中找到该主题的一些进展。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。