コンテンツにスキップ

「スキップリスト」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
m →‎説明: 英語版(15:28, 12 February 2017‎)を元に、追記修正。
→‎Implementation details: 英語版( 22:17, 20 April 2017‎ )を元に追記・修正
84行目: 84行目:

挿入と削除は、[[連結リスト]]の対応する操作と同様の実装になるが、"背の高い"要素は2つ以上の連結リストに対して挿入及び削除する必要がある。

挿入と削除は、[[連結リスト]]の対応する操作と同様の実装になるが、"背の高い"要素は2つ以上の連結リストに対して挿入及び削除する必要がある。



また、昇順にそれぞれのノードを訪れる<!--例えばPrintEntireListToScreen()とか-->ような<math>\mathcal{O}(n)</math>の操作において、裏でスキップリストの構造を最適化することできるi番目のノードの高さをi=m*2^n(mは奇数)とした場合のnに1加えたものにする。しかし、この方法では誰かが何処に高い要素があるかを知ってそれをリストから削除することでアルゴリズムの効率を低下させることができる。


<!--PrintEntireListToScreen()--><math>\mathcal{O}(n)</math><math>\mathcal{O}(\log n)</math>ii=m*2^nmn1i=0 



1i2222

その代わりに、次のように高さを擬似的にランダマイズすることができる。最初に全てのノードの高さを1にする。次にi番目のノードについて、奇数ならば高さを2にするかどうかをランダムに決める。偶数ならば直前のノードの高さが2になっていないときのみ高さを2にする。高くなったノードの数が2以上なら高さを上げてこれを繰り返す。

ランダム性の削除と同様に、この擬似的なランダマイズはノードを全て訪れる場合にのみ実行する。



擬似的なランダマイズを行う利点は、ランダム性の無い場合と違い、敵意のあるユーザーに高さに関する情報を漏らさないことである。悪意あるユーザが高さに関する情報を知っていると、レベルの高いノードを削除するだけで性能を悪化させことができるため、この性質は望ましい。(これに対し、BetheaとReiterは、悪意あるユーザが性能劣化を起こすために、確率的タイミング方法を使用できると主張している<ref>{{cite conference |first1=Darrell |last1=Bethea |first2=Michael K. |last2=Reiter |title=Data Structures with Unpredictable Timing |url=https://www.cs.unc.edu/~djb/papers/2009-ESORICS.pdf#page=5 |at=pp. 456–471, §4 "Skip Lists" |doi=10.1007/978-3-642-04444-1_28 |conference=ESORICS 2009, 14th European Symposium on Research in Computer Security |location=Saint-Malo, France |date=September 21–23, 2009 |isbn=3-642-04443-3}}</ref>。)

これらの2つの主張を説明しよう。まず、検索が対数時間で終わることを示す。高さが1以上である全てのノードの中でn番目のノードを見つけることを考える。nが偶数であれば、その高さが1より大きい確率は1/2であるが、もしノードの高さが1であるならばn-1番目のノードの高さは1より大きいことが保証される。nが奇数であれば、その高さが1より大きい確率は1/2である。このときn番目のノードの高さが1でかつn-1番目のノードの高さも1であるとすると、n-2番目のノードの高さは1より大きいことが保証される。この解析を高さが2以上のノード、3以上のノード……と繰り返していく。それぞれの解析でnは高さがk以上であるようなノードの中で何番目であるかということを注意しておく。以上から、検索時間はランダマイズされていないスキップリストと比べて最良の場合(探しているノードが考えうる限り最も高さが高いとき)は同じで、最悪でも2倍となる(左に1回ではなく2回動かなければならないため)。<!-- ランダマイズされていない場合は高さが1, 2, 1, 2といった具合に配置されているが、ランダマイズされている場合は2, 1, 1, 2と配置されることがある。 -->

検索時間については、ランダム性の無い場合と同様、対数時間であることが保証されている。



以下の「最適化」を考えてみよう。「次に,各i番目のノードに対して・・・」の部分で、各奇数と偶数のペアに対するコイン投げをするのをやめ、その替わり、コインを1回だけ振って、全てのペアに対して偶数番目のノードの高さを上げるか、あるいは奇数の方の高さを上げるかを決める。これで、コイン投げの回数は、<math> \mathcal{O} ( n \log n ) </math> でなく <math> \mathcal{O} ( \log n ) </math> に削減できる。 しかし残念ながら、この方法では、悪意あるユーザの「全ての偶数番目のノードは高さが1より大きいだろう」という推測が50%の確率で当たってしまう。悪意あるユーザが、ある1つのノードの高さを正しく推測できる確率は非常に低いにも関わらず。


k21/2222231/231/4k1/(2^(k-1))


<!-- これらの2つの主張を説明しよう。まず、検索が対数時間で終わることを示す。高さが1以上である全てのノードの中でn番目のノードを見つけることを考える。nが偶数であれば、その高さが1より大きい確率は1/2であるが、もしノードの高さが1であるならばn-1番目のノードの高さは1より大きいことが保証される。nが奇数であれば、その高さが1より大きい確率は1/2である。このときn番目のノードの高さが1でかつn-1番目のノードの高さも1であるとすると、n-2番目のノードの高さは1より大きいことが保証される。この解析を高さが2以上のノード、3以上のノード……と繰り返していく。それぞれの解析でnは高さがk以上であるようなノードの中で何番目であるかということを注意しておく。以上から、検索時間はランダマイズされていないスキップリストと比べて最良の場合(探しているノードが考えうる限り最も高さが高いとき)は同じで、最悪でも2倍となる(左に1回ではなく2回動かなければならないため)。-->



<!-- ランダマイズされていない場合は高さが1, 2, 1, 2といった具合に配置されているが、ランダマイズされている場合は2, 1, 1, 2と配置されることがある。 -->



<!-- k21/2222231/231/4k1/(2^(k-1))-->





メモリアクセスの局所性の問題やその他の問題のため、スキップリストが実際の性能とメモリ効率において[[B木]]より悪いという証拠が存在する([http://resnet.uoregon.edu/~gurney_j/jmpc/skiplist.html])。

メモリアクセスの局所性の問題やその他の問題のため、スキップリストが実際の性能とメモリ効率において[[B木]]より悪いという証拠が存在する([http://resnet.uoregon.edu/~gurney_j/jmpc/skiplist.html])。


2017年4月21日 (金) 03:30時点における版

スキップリスト
種類 リスト
考案者 William Pugh
発表年 1989年
計算量ビッグ・オー記法
平均 最悪
空間計算量
探索の時間計算量
挿入の時間計算量
削除の時間計算量

: skip list使使O(log n)1989William Pugh[1][2][3][4]

150%225%312.5%
110


i i+1 p使 p 1/2  1/4 1/(1-p) 

辿 1/p  pp使

Implementation details


11

""2

ii=m*2^nmn1i=0 

1i2222

(BetheaReiter使[5])

i1   1501






B[1]


Willam Pugh辿



Skip lists are a probabilistic data structure that seem likely to supplant balanced trees as the implementation method of choice for many applications. Skip list algorithms have the same asymptotic expected time bounds as balanced trees and are simpler, faster and use less space.

使[2]


1990 William Pugh  A Skip List Cookbook[4] 

 - k O(log k) 



 - O(log n)





使


12: skip quadtree: skip octree[6]使 O(log n)使 O(n)2005 David Eppstein [7]

kd


P2P112003 James Aspnes [8]


Java  Java 6  java.util.concurrent.ConcurrentSkipListSet[9]  ConcurrentSkipListMap[10] 

参照

  1. ^ Pugh, William (August 1989). “Skip lists: a probabilistic alternative to balanced trees”. Proceedings of the Workshop on Algorithms and Data Structures, Ottawa Canada. 
  2. ^ Pugh, William (June 1990). “Skip lists: a probabilistic alternative to balanced trees”. Communications of the ACM 33: 668-676. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.17.9380. 
  3. ^ Pugh, William (1990). “Concurrent Maintenance of Skip Lists”. Univ. of Maryland Institute for Advanced Computer Studies Report No. UMIACS-TR-90-80 (University of Maryland at College Park). http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.17.8201. 
  4. ^ a b Pugh, William (1990). “A Skip List Cookbook”. Univ. of Maryland Institute for Advanced Computer Studies Report No. UMIACS-TR-89-72.1 (University of Maryland at College Park). http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.17.524. 
  5. ^ Bethea, Darrell; Reiter, Michael K. (21–23 September 2009). Data Structures with Unpredictable Timing (PDF). ESORICS 2009, 14th European Symposium on Research in Computer Security. Saint-Malo, France. pp. 456–471, §4 "Skip Lists". doi:10.1007/978-3-642-04444-1_28. ISBN 3-642-04443-3
  6. ^ J. R. Woodwark (1984). “Compressed Quad Trees”. Computer journal 27 (3): 225-229. http://comjnl.oxfordjournals.org/content/27/3/225.full.pdf. 
  7. ^ David Eppstein; Michael T. Goodrich; Jonathan Z. Sun (2005). “The Skip Quadtree: A Simple Dynamic Data Structure for Multidimensional Data”. SCG '05 Proceedings of the twenty-first annual symposium on Computational geometry: 296-305. doi:10.1145/1064092.1064138. http://arxiv.org/abs/cs/0507049. 
  8. ^ James Aspnes; Gauri Shah (2003). “Skip graphs”. Fourteenth Annual ACM-SIAM Symposium on Discrete Algorithms: 384–393. http://arxiv.org/abs/cs/0306043. 
  9. ^ ConcurrentSkipListSet (Java Platform SE 8 )
  10. ^ ConcurrentSkipListMap (Java Platform SE 8 )