用于实验和学习目的。我试图从一个哈希函数创建一个排序算法,该算法给出一个偏向于字符串字母顺序的值,然后理想情况下将它放在该哈希的正确位置。我试图寻找一个哈希偏向排序函数,但只找到一个整数,如果适合我的目的,那将是一个内存猪。
原因是理论上如果做得好,这个算法可以达到 O(n) 的速度或接近。
所以这是我到目前为止在 python 中所做的:
letters = {'a':0,'b':1,'c':2,'d':3,'e':4,'f':5,'g':6,'h':7,'i':8,'j':9,
'k':10,'l':11,'m':12,'n':13,'o':14,'p':15,'q':16,'r':17,
's':18,'t':19,'u':20,'v':21,'w':22,'x':23,'y':24,'z':25,
'A':0,'B':1,'C':2,'D':3,'E':4,'F':5,'G':6,'H':7,'I':8,'J':9,
'K':10,'L':11,'M':12,'N':13,'O':14,'P':15,'Q':16,'R':17,
'S':18,'T':19,'U':20,'V':21,'W':22,'X':23,'Y':24,'Z':25}
def sortlist(listToSort):
listLen = len(listToSort)
newlist = []
for i in listToSort:
k = letters[i[0]]
for j in i[1:]:
k = (k*26) + letters[j]
norm = k/pow(26,len(i)) # get a float hash that is normalized(i think thats what it is called)
# 2nd part
idx = int(norm*len(newlist)) # get a general of where it should go
if newlist: #find the right place from idx
if norm < newlist[idx][1]:
while norm < newlist[idx][1] and idx > 0: idx -= 1
if norm > newlist[idx][1]: idx += 1
else:
while norm > newlist[idx][1] and idx < (len(newlist)-1): idx += 1
if norm > newlist[idx][1]: idx += 1
newlist.insert(idx,[i,norm])# put it in the right place with the "norm" to ref later when sorting
return newlist
我认为第一部分很好,但第二部分需要帮助。所以 Qs 将是做这样的事情的最佳方法,或者甚至有可能从中获得 O(n) 时间(或接近那个时间)?
我对 88,000 个单词列表进行的测试大约需要 5 分钟,10,000 个单词大约需要 30 秒,随着列表计数的增加,情况变得更糟。
如果这个想法真的可行,那么我会用 C 重新编码以获得一些真正的速度和优化。
第二部分之所以存在,只是因为它可以工作-即使速度很慢,而且我想不出更好的方法来为我的一生做这件事,我想用不需要做其他循环的东西来代替它一切皆有可能。
感谢您提供的任何建议或想法。