【发布时间】:2013-08-13 15:36:22
【问题描述】:
如果我有一个变量列表, [a, b, a, c, a, a, d, b, c, d, a] 其中顺序很重要, 我必须将它们重命名为整数,我可以使用的最佳算法是什么?
一个简单的算法将是:
- 创建一个空的哈希表,HT。
- 对于列表中的每个变量,
- 如果它没有被索引,则为其分配一个新索引并将(变量,索引)放入HT。
- 如果已编入索引,请使用索引。
在上述情况下,解决方案将是 [1, 2, 1, 3, 1, 1, 4, 2, 3, 4, 1]
我关心“n”哈希查找以及随之而来的复杂性。对于非常长的列表(具有更多不同的变量),性能可能非常糟糕。有没有人有更好的算法来处理这个?
请注意,虽然示例使用 ascii 字符,但列表的元素可以是任意字符串,列表的长度可以是任意长(> 100k)等。
【问题讨论】:
-
我认为哈希表查找是 O(1),除非你遇到冲突
-
您的意思是
O(1)哈希查找对吗?O(1)forNitems 是总算法的效率,而不是哈希查找。 -
数字必须以1开头并且是连续的吗?还是只是不同?
-
如果您的变量名称都是单字母名称,您可以使用 int[128] 并使用单字母名称字符的 ASCII 值作为索引。这样可以避免哈希表。
-
在您的示例中,您可以简单地使用变量的一个字符名称并使用
character-'a'+1作为数字来计算数字。这将产生'a' -> 1, 'b' -> 2 , 'c' -> 3, 'd' -> 4。