一种有效的重命名算法

时间:2013-08-13 15:36:23

标签: algorithm hashtable

如果我有一个变量列表,[a,b,a,c,a,a,d,b,c,d,a]其中顺序很重要, 我必须将它们重命名为整数,我可以使用的最佳算法是什么?

一个简单的算法将是:

  1. 创建一个空哈希表,HT。
  2. 对于列表中的每个变量,
    1. 如果未编入索引,则为其分配新索引并将(变量,索引)放入HT中。
    2. 如果已编入索引,请使用索引。
  3. 在上述情况下,解决方案将是[1,2,1,3,1,1,4,2,3,4,1]

    我关注'n'哈希查找以及随之而来的复杂性。对于很长的列表(具有更多不同的变量),性能可能非常糟糕。有没有人有更好的算法来处理这个?

    请注意,虽然该示例使用ascii字符,但列表的元素可以是任意字符串,列表的长度可以任意长(> 100k)等。

1 个答案:

答案 0 :(得分:0)

O(n)最坏情况哈希查找仅在使用朴素冲突解决方案时发生(并且所有项目都映射到相同的哈希值) - 您实际上使用哈希,因为您希望冲突“罕见”,从而平均受益从O(1)查询时间开始。

因为您必须检查所有变量的重复项,所以总共不会比O(n)好。

也许您可以利用其他信息 - 是否排序了变量名称的第一个实例列表?如果是,您只需要存储到目前为止遇到的字典最大变量名称(vmax),从null开始,并将列表元素与它们进行比较。如果测试元素vcur小于或等于vmax,则您之前已经看过变量名称,否则递增计数器,将vcur与其关联并将vmax设置为vcur

相关问题