代码之家  ›  专栏  ›  技术社区  ›  Upul Bandara

为每个英文单词生成唯一序列号的算法

  •  2
  • Upul Bandara  · 技术社区  · 15 年前

    对于应用程序,我需要为每个英语单词生成唯一的序列号。

    最好的方法是什么?

    一个限制是序列号生成算法在普通台式计算机中应该非常有效。

    8 回复  |  直到 15 年前
        1
  •  7
  •   Andreas Bonini    14 年前

    如果不是,那么保证它们唯一性的一个简单方法就是使用单词本身作为序列号。例如 ABC = 0x41 0x42 0x43 = 4276803 . 正如在评论中所建议的,还有其他方法(不过需要更多的工作),比如先用Huffman压缩单词。

    肺炎显微镜下矽肺孢子虫病 例如,需要大约100位数字。

    否则,您可以使用散列,但不能保证它对所有英语单词都是唯一的。

        2
  •  6
  •   anon anon    15 年前

    您似乎在询问一个完美的哈希函数。如果是这样,请看一看 this Wikipedia article gperf 效用。

        3
  •  4
  •   Alexandru    15 年前

    下面是一个算法(python),允许您对小写字母的任意组合进行编码和解码:

    def encode(s):
      r = 1
      for i in len(s):
        r = r * 26 + (ord(s[i]) - ord('a'))
      return r
    

    使用64位,您最多可以编写12个字母的单词。您可以将剩余的未使用序列用作包含低频非常长单词的表的索引。

        4
  •  3
  •   Charles Salvia    15 年前

    只需使用64位哈希函数,如 Fowler-Noll-Vo . 使用64位整数不太可能发生冲突,因为这会给您2^64个可能的值,而且英语中的单词肯定要少很多。当然,您需要规范化每个单词(转换为小写,等等)

        5
  •  3
  •   mfeingold    15 年前

    你真的需要它是“连续的”吗?如果没有-您是否尝试使用各种哈希算法?其中有几个是内置在.NET中的(如果我没记错的话,是MD5和SHA1)。我不确定哪一个足够好,尤其是短弦

        6
  •  1
  •   BenAlabaster    15 年前

    你在找什么 每一个 单词,还是英语词典里的每个单词?您使用的是标准单词,即牛津英语词典中的标准单词,还是也包括俚语单词?我想我的意思是:“你的字典有多大?”?你可以使用一个MD5散列,它在理论上有可能发生冲突——尽管在数十亿个可能发生冲突的散列中只有1个——但是,我不能说我理解使用散列而不是使用实际单词的目的。除非您希望计算串行客户端,以便它在服务器端引用正确的字典项,而不必解析字典以查找其串行数据。当然,这个词显然必须足够独特,才能让我们像人类一样理解它,而且我们在解析词的含义方面比计算机更有效。

    您是否希望将看起来相同但发音不同的单词分开?看起来和听起来一样但含义不同的单词?如果是这样的话,那么你将用一个散列来解开,因为相同的拼写和不同的语义将产生相同的散列,所以它在这种情况下不起作用。在这种情况下,您需要某种增量系统。如果你在字典中添加事实之后的单词,它们会被添加到末尾,并按顺序给出下一个序列号吗?如果该词与另一个词拼写相同,但听起来不同,或者听起来相同,但语义不同,该怎么办?然后呢?

    我想这取决于序列化的目的,即什么是最适合序列号的输出,因此什么是最有效的算法。

    最有效的算法可能是将字典拆分为与处理器数量相同的块,并让每个处理器上的线程序列化其块中的单词,最后重新组合每个线程的输出。在现实世界中,这个(理论上)的工作速度比O(n/处理器数量)稍慢,但是我认为对于数学正确性来说,它仍然是O(n),因为你仍然需要解析整个字典一次来序列化每个单词。

    我认为最安全的方法是:

    • 担心你现在得到了什么
    • 按顺序给它们编号

    这样,您就不必担心在序列号中留下空格来解释单词之间的插入,也不必担心在插入单词时重新索引任何相关数据来解释索引中的更改,您只需按正常方式进行即可。您不必担心冲突,而且您仍然可以获得用于存储目的的最有效的索引机制,这意味着您不会存储可能比原始单词长的MD5哈希-这对于实际使用没有意义。

    如果你需要按字母顺序查字典,就按单词排序,否则就不要查了。

    我仍然认为我不知道是否有必要对这个词进行序列化——除了为了存储的目的,你可以通过这个词的键来存储你的字典和链接表。

        7
  •  0
  •   Windows programmer    15 年前

    我想知道答案是否可能。

    波兰语和波兰语是同一个词吗?

    watch(名词)和watch(动词)是同一个词吗?

    分析(单数名词)和分析(复数名词)不是同一个词。analyze(复数动词)和analyze(复数动词)是同一个词吗?analysis(单数动词)和analysis(单数动词)是同一个词吗?分析(单数动词)和分析(复数名词)是同一个词吗?

    习惯和不习惯是同一个词吗?

        8
  •  -1
  •   Nick Berardi    15 年前

    关于MD5哈希算法。这样做:

    serialNumber = MD5( ToLower ( english word ) )