2011-01-23 14 views
0

あなたがサイズNの単一のリンクされたリストを持っていて、最後からすべての要素に対して操作を実行したいとします。1つのリンクされたリスト上での操作のBig-O

私は、次の擬似コードを作ってみた:

while N > 0 
    Current = LinkedList 
    for 0 to N 
     Current = Current.tail 
    end 
    Operation(Current.head) 
    N := N-1 
end 

は今、私はこのアルゴリズムがあるビッグ-Oを判断するんです。

N + (N-1) + (N-2) + ... + (N-(N-1)) + 1 

しかし、私は実際にビッグ-Oであることはよく分からない:(1)、私はそれがこのようなものだと思う操作は()Oとすると
。私はそれがO(N^2)よりもはるかに小さいと思うが、あなたはそのO(N)を言うことはできないと思う...

+0

1 + 2 + 3 + ... + N = N *(N + 1 )/ 2 O(n^2) – CodesInChaos

+0

私はあなたの構造を理解していませんが、現状(ノードのように見える)というLinkedListを持っています。あなたが前/次のことを意味したら、それは二重にリンクされています。彼らが本当に頭か尾であれば、上のコードは全く意味を持たない。 – bestsss

+0

@bestsss:まあ、あなたはLinkedListがオブジェクトであると言うことができ、While-Loopに入るたびにCurrentで参照します。現在の(「LinkedList」である)Currentの「head」を呼び出して、実際のElementを返し、「tail」は、尾を含む別のLinkedListオブジェクトを返します。 – fresskoma

答えて

5

あるあなたの式は、基本的にtriangular numbersのものです合計はN(N + 1)/ 2になる。それからO()を決定するために私はあなたを残します!

これを行うより速い方法は、元のリストとは逆の新しいリストを作成し、その上で操作を実行することです。

+1

よく、新しいリスト[O(n)memory - nodes/arrayのために]を作る必要はありません。逆/プロセス/逆も実行可能である。 – bestsss

+0

@bestsss:* O(n)*時間で、単一リンクリストをインプレースでどのように逆転させるのですか? –

+2

非常に同じノードを使用することは古典的な問題です。例えば、次のようなものです:http://stackoverflow.com/questions/4686011/invert-linear-linked-list/4687305#4687305 - 余分なメモリもなく、O(n)時間、O(1)メモリ – bestsss

2

あなたのアルゴリズムはO(n^2)あなたの投稿にあなたはO(n)でそれを行うことができます。

Big-O表記はアルゴリズムの時間の複雑さに拘束されたの上位であることを覚えておくことが重要です。

2

1+2+3+...+n = n*(n+1)/2 = 0.5 * N^2 + O(N)

これはO(N^2)であり、O(N^2)タイトである、すなわち、それが含まれているだろう何より低い実行順序はありませんあなたのランタイム。

前後から動作する高速アルゴリズムは、O(N)の代わりに、O(N^2)を有することができる

+0

前から後ろまで働くアルゴリズムは* O(n)*でもかまいません。 @ Oliの答えを見てください。 –

+0

@Carlあなたはそうだけど、O(n)の追加メモリか好きなリストの一時的な突然変異が必要です。いずれも素晴らしいことではありません。 – CodesInChaos

+1

これは絶対に真実ですが、いいものではありません。 –

関連する問題