キャリアカップでこの質問を読みましたが、「SkipList」以外に良い答えが見つかりませんでした. ウィキペディアで見つけたSkipListの説明は興味深いものでしたが、「幾何/二項分布」などの用語がわかりませんでした...それが何であるかを読んで、確率論に深く入り込みました。単純に、検索を高速化する方法を実装したかっただけです。1. インデックスを作成しました。- たとえば 1000 個のノードを作成する関数を作成しました。次に、連結リスト型の配列を作成し、1000 個のノードをループして、23 番目ごとの要素 (頭に浮かんだ乱数) を選択し、「インデックス」と呼ぶ配列に追加しました。
SLL index = new SLL[50]
次に、インデックスを作成する関数:
private static void createIndex(SLL[] index, SLL head){
int count=0;
SLL temp = head;
while(temp!=null)
{
count++;
temp = temp.next;
if((count==23){
index[i] = temp;
i++;
count=0;
}
}
}
最後に「検索」機能です。その関数では、最初に入力要素 769 を例に取ります。「index」配列を調べると、index[i]>769 が見つかります。したがって、head = index[i-1] と tail = index[i] を「find」関数に渡します。次に、23 要素の短い範囲で 769 を検索します。したがって、必要な要素を見つけるのに合計 43 回のジャンプ (配列ジャンプと node=node.next ジャンプを含む) が必要であると計算しました。 769回ジャンプしました。
注: インデックス配列を作成するコードは検索の一部ではないと考えているため、'find' 関数の時間の複雑さに時間の複雑さ (ひどい) を追加しません。このインデックスの作成は、リストが作成された後に別の関数として行うか、またはタイムリーに行う必要があると思います。ウェブページが Google 検索で表示されるまでに時間がかかるのと同じです。また、この質問は Microsoft のインタビューで聞かれましたが、私が提供したソリューションは役に立つものなのか、それともそのような種類のソリューションを提供することで馬鹿に見えるのでしょうか。ソリューションは Java で記述されています。あなたのフィードバックを待っています。