Algorithm 一种高效的重命名算法
如果我有一个变量列表,[a,b,a,c,a,d,b,c,d,a],其中顺序很重要, 我必须把它们重命名为整数,我能用的最好的算法是什么 一个简单的算法是:Algorithm 一种高效的重命名算法,algorithm,hashtable,Algorithm,Hashtable,如果我有一个变量列表,[a,b,a,c,a,d,b,c,d,a],其中顺序很重要, 我必须把它们重命名为整数,我能用的最好的算法是什么 一个简单的算法是: 创建一个空哈希表HT 对于列表中的每个变量, 如果未编制索引,则为其分配一个新索引,并将(变量,索引)放入HT中 如果已编制索引,请使用索引 在上述情况下,解决方案将是[1,2,1,3,1,1,4,2,3,4,1] 我关心的是'n'散列查找以及随之而来的复杂性。对于非常长的列表(具有更多不同的变量),性能可能非常差。有谁有更好的算法来处理这
O(n)
最坏情况下的哈希查找仅在使用原始冲突解决方案时发生(并且所有项都映射到相同的哈希值)-实际上,您使用了哈希,因为您希望冲突是“罕见的”,从而平均受益于O(1)
查找时间
由于您必须检查所有变量是否存在重复项,因此总体上不会比O(n)
更好
也许您可以利用其他信息—变量名的第一个实例列表是否已排序?如果是,则只需存储迄今为止遇到的按字典顺序排列的最大变量名(
vmax
),从null
开始,并将列表元素与其进行比较。如果被测元素vcur
小于或等于vmax
,您之前已经看到了变量名,否则增加一个计数器,将vcur
与之关联,并将vmax
设置为vcur我认为哈希表查找是O(1),除非您的意思是O(1)
哈希查找对吗O(1)
对于N
项,是整个算法的效率,而不是哈希查找。数字必须从1开始并按顺序排列吗?如果变量名都是单字母名称,可以使用int[128]并使用单字母名称字符的ASCII值作为索引。这将避免哈希表。在您的示例中,您可以简单地使用变量的一个字符名,并使用字符-'a'+1
作为数字来计算数字。这将产生'a'->1,'b'->2,'c'->3,'d'->4
。我必须澄清——如果列表中有'n'项,则有'n'哈希查找。很抱歉造成混淆。您仍然有O(1)
每次哈希查找。而且,您的操作总数不会少于n
,因为您必须检查每个变量名(除非您有额外的信息允许您跳过元素或提前终止)。