Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 一种高效的重命名算法_Algorithm_Hashtable - Fatal编程技术网

Algorithm 一种高效的重命名算法

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'散列查找以及随之而来的复杂性。对于非常长的列表(具有更多不同的变量),性能可能非常差。有谁有更好的算法来处理这

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

一个简单的算法是:

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

    我关心的是'n'散列查找以及随之而来的复杂性。对于非常长的列表(具有更多不同的变量),性能可能非常差。有谁有更好的算法来处理这个问题吗

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

    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
    ,因为您必须检查每个变量名(除非您有额外的信息允许您跳过元素或提前终止)。