web-dev-qa-db-ja.com

リンクリストO(1)の中央に挿入するのはなぜですか?

リンクリストに関するウィキペディアの記事 によると、リンクリストの中央に挿入することはO(1)と見なされます。 O(n)になると思います。リストの最後近くにあるノードを見つける必要はありませんか?

この分析では、ノード操作の検出(必須ではあります)および挿入自体の説明は行われませんか?

[〜#〜] edit [〜#〜]

リンクリストには、配列よりもいくつかの利点があります。リストの特定のポイントへの要素の挿入は一定時間の操作ですが、配列への挿入には要素の半分以上の移動が必要になる場合があります。

上記の声明は、私を少し誤解させます。間違っている場合は修正してください。しかし、結論は次のようになります。

配列:

  • 挿入/削除ポイントの検索O(1)
  • 挿入/削除の実行O(n)

リンクリスト:

  • 挿入/削除ポイントO(n)を見つける
  • 挿入/削除の実行O(1)

位置を見つける必要がないのは、その位置への何らかのポインタを保持している場合だけです(場合によっては、頭と尾のように)。そのため、リンクリストは常に挿入/削除オプションの配列に勝るとは言えません。

90
Rob Sobers

あなたは正しい、記事は「インデックス作成」を別の操作と見なします。したがって、挿入自体はO(1)ですが、その中間ノードに到達するのはO(n)です。

101
CookieOfFortune

挿入自体はO(1)です。 Node結果はO(n)です。

24
Evansbee

いいえ、挿入することを決定した場合、リストを繰り返し処理している最中であるとみなされます。

リンクリストの操作は、一般的な「リスト」としてではなく、ノードのコレクションとして扱われるように行われることがよくあります。ノード自体をメインループの反復子と考えてください。そのため、リストをざっと見ていくと、ビジネスロジックの一部として、新しいノードを追加(または古いノードを削除)する必要があることに気づきます。 1回の反復で50個のノードを追加できます。これらのノードはそれぞれ、O(1) 2つの隣接ノードをリンク解除して新しいノードを挿入する時間です。

編集:男、2番目の段落を入力すると、最初のレスポンダーである代わりに突然、5番目で最初の4と同じことを言っています!

21
Bill K

チャートと同じように配列と比較するために、O(1)です。新しいノードの後に​​すべてのアイテムを移動する必要はありません。

そうです、彼らはあなたが既にそのノードへのポインタを持っているか、ポインタを取得するのは簡単だと仮定しています。言い換えれば、問題は「Xで指定されたノード、このノードの後に​​挿入するコードは何ですか?」と述べられています。挿入ポイントから開始します。

6
Joel Coehoorn

リンクされたリストへの挿入は、リスト全体の繰り返しとは異なります。アイテムを見つけるのではなく、ポインターをリセットしてアイテムをそこに置きます。フロントエンドの近くに挿入するか、エンドの近くに挿入するかは関係ありませんが、挿入にはポインタの再割り当てが必要です。もちろん、それがどのように実装されたかに依存しますが、それがリストの強みです。簡単に挿入できます。インデックスを介したアクセスは、配列が輝く場所です。ただし、リストの場合、n番目のアイテムを見つけるには、通常O(n)になります。少なくとも、それは学校で覚えていることです。

5
itsmatt

ループを伴わないためです。

挿入は次のようなものです。

  • 挿入要素
  • 前へのリンク
  • 次へのリンク
  • やった

いずれにしても、これは一定時間です。

したがって、n個の要素を順番に挿入するとO(n)になります。

3
Tomalak

この分析では、ノード操作の検出(必須ではあります)および挿入自体の説明は行われませんか?

わかった。特定のポイントへの挿入は、挿入するアイテムへのポインターを既に保持していることを前提としています。

InsertItem(item * newItem, item * afterItem)
3
e.James

挿入はO(1)どこに配置するかがわかれば.

2

いいえ、検索の対象にはなりません。ただし、リストの中央にあるアイテムへのポインターを既に保持している場合、そのポイントに挿入するとO(1)になります。

検索する必要がある場合は、検索時間を追加する必要があります。これはO(n)である必要があります。

2
T.E.D.

この記事は、配列とリストを比較することについてです。配列とリストの両方の挿入位置を見つけるのはO(N)なので、この記事ではそれを無視します。

0
anon

O(1)は、新しいアイテムを挿入するアイテムがあるという事実に依存しています。 (前または後)。そうでない場合は、O(n)です。そのアイテムを見つける必要があるためです。

0
Glenn

O()表記法で数えることを選択したもののケースだと思います。カウントする通常の操作を挿入する場合はコピー操作です。配列では、中央に挿入しますリンクリストを使用すると、2つのポインターが設定されます。何を挿入しても場所を見つける必要があります。

0
workmad3

操作後に挿入するノードの参照がある場合、リンクされたリストの場合はO(1)です。
配列の場合、結果のノードをすべて移動する必要があるため、まだO(n))です。

0

最も一般的なケースは、おそらくリストの先頭または末尾に挿入することです(リストの末尾を見つけるのに時間がかかることはありません)。

対照的に、配列の先頭または末尾にアイテムを挿入する(末尾にある場合は配列のサイズを変更する必要があり、先頭にある場合はすべての要素のサイズを変更して移動する必要があります)。

0
ChrisW