実験および学習の目的で。文字列のアルファベット順にバイアスされた値を与えるハッシュ関数から並べ替えアルゴリズムを作成しようとしていたので、理想的にはそのハッシュから適切な場所に配置します。ハッシュバイアスの並べ替え関数を探してみましたが、整数の場合は1つしか見つかりませんでした。目的に合わせて調整すると、メモリを大量に消費することになります。
その理由は、理論的には、このアルゴリズムを正しく実行すれば、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
前半はいいと思いますが、後半は助けが必要です。したがって、Qは、このようなことを行うための最良の方法であるか、またはこれからO(n)時間(またはその近く)を取得することさえ可能でしょうか?
私が88,000語のリストで行ったテストには、約5分かかり、10,000語には約30秒かかりました。リスト数が増えると、さらに悪化しました。
このアイデアが実際にうまくいく場合は、Cで再コーディングして、実際の速度と最適化を取得します。
2番目の部分は、それが機能するという理由だけであります-たとえ遅くても、私はそれを私の人生のために行うためのより良い方法を考えることができません、私はそれを他のループを行う必要がないものに置き換えたいと思います可能な限り。
あなたが与えることができるアドバイスやアイデアに感謝します。