web-dev-qa-db-ja.com

アルゴリズムの復習。ヒープソートがインソートアルゴリズムである理由

ヒープソートがインプレースsortingアルゴリズムと見なされる理由がわかりません。

つまり、並べ替える配列の要素、つまりヒープが入力されたextraデータ構造は、最小値の抽出と並べ替えプロセスを支援するために使用されます。

では、ここでのインプレースの定義を誤解しているのではないでしょうか?

しかし、たとえば挿入ソートは、それがインプレースアルゴリズムであることは明らかです。つまり、要素に追加のメモリは必要ありません。

では、なぜそれが適切であると考えられるのでしょうか?

15
user10326

つまり、並べ替えられる配列の要素(ヒープなど)が追加された追加のデータ構造が、最小値の抽出と並べ替えプロセスを支援するために使用されます。

いいえ。配列は、O(1)以上の追加メモリを使用することなく、ヒープ制約に準拠するように変換されます(実際に必要なのは、配列の1つの要素を保持するのに十分な追加メモリだけです。スワップの目的のために、さらにブールまたは2つとループ変数または2つ)。

技術的には、ヒープソートは通常、別のヒープを使用するものとして説明されているかもしれませんが、インプレースで実装することは完全に可能です。

12
Peter Taylor

配列を使用してツリーのレイアウトを指定できるという基本的な理解が欠落している可能性があります。

バイナリツリーがあり、内部ノードが配列のインデックスiにあるとします。次に、そのノードの親と子の配列インデックスを次のようにして見つけることができます。

Parent(i) = floor(i/2)
Left child(i) = 2i
Right child(i) = 2i + 1

見る:

http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/heapSort.htm

ヒープは配列内に完全に保持および編成できるため、入力配列内で要素を移動することにより、ヒープソートをインプレースで実行できます。実際、ヒープは元の入力配列を使用して構築および操作されます。

あなたが言うように、ヒープを構築するために追加の構造が本当に必要な場合、heapsortは実際にはインプレースソートアルゴリズムではありません。

ただし、これは当てはまりません。ソートしたい配列とまったく同じ配列にヒープを構築できます。その後、ヒープソートアルゴリズムを適用して、インプレースでソートします。

1
Daniel Scocco

コンピュータサイエンスでは、インプレースアルゴリズム(またはラテン語のin situ)は、少量の一定の追加ストレージスペースを持つデータ構造を使用して入力を変換するアルゴリズムです。アルゴリズムが実行されると、通常、入力は出力によって上書きされます。インプレースではないアルゴリズムは、インプレースまたはアウトオブプレースと呼ばれることがあります。

Wikipedia-インプレースアルゴリズム

0
Rein Henrichs

スペース要件はごくわずかであるため、適切であると見なされます(ビット単位の演算を使用してアイテムを交換している場合は、一定またはまったくない)。たとえば、MergeSortは適切ではありません。これは、検索例の反復ごとに入力セットが変更されないためです。

インプレースアルゴリズムとアウトオブプレースアルゴリズムの違いを説明する最良の方法は、(K&Rから)実行する次のC/C++文字列反転コードを調べることです。

void reverse(char s[])
{
      int c, i, j;

      for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
      }
}

たとえば、入力文字列を最後から読み取り、別のバッファに文字を配置する場合、それは場違いな文字列反転アルゴリズムになります。

0
rdasxy