2

自分が何をしているのか、わからないふりをする。コールバックを必要とする配列の並べ替えと比較関数がどのように機能するか説明できますか?

uasort()関数を例にとります。これを処理するコールバック関数をどのように設計すればよいですか? データを並べ替えようとしているときの「-1」、「+1」、および「0」の意味は何ですか? すべての配列要素をスキャンしますか? それともそれよりも効率的ですか?「w」を「b」の前に置き、「a」を「x」の前に置きたい場合はどうすればよいですか? この一見単純な分野であなたが与えることができるアドバイスは、非常に高く評価されます.

4

2 に答える 2

1

やってみます!

例として、名前のリストを見てみましょう。あなたも私も、名前のリストをアルファベット順にソートする方法を知っており、それを 100 億回も実行しました。同じことが、たとえば数字にも当てはまります。コンピューターは、並べ替えがそれほど直感的ではない場合でも、データを並べ替えることができる必要があります。

配列をソートするためのコールバック関数には、その配列内の任意の 2 つの項目が互いにどのように関連するかを示すための「ルール」を提供するコールバックを使用して、配列に任意の種類のデータを含めることができるようにするという考えが含まれます。このようにして、並べ替えアルゴリズムはそのデータ配列を取得し、「コールバック」関数を繰り返し呼び出して、どの要素がどの順序に属しているかを判断し、並べ替えられたリストを返すことができます。それがコールバックの本質です。

文字通りの類推が必要な場合は、データのリストを友人に渡すふりをします。友人は並べ替えの方法しか知らず、リスト内の項目がどのように関連しているかは知りません。彼らはあなたに「コールバック」し、「これらの 2 つの要素のどちらが最初に来るのか」という質問をします。そして、データとルールを知っているあなたは、アイテムを受け取り、ルールを適用してから、友達に答えを伝えます。最終的に、このプロセスを複数回繰り返した後、データはソートされて返されます。

このように、-1、0、または 1 を返す「コールバック」は、2 つのデータで呼び出された場合、-1 は「アイテム 1 がアイテム 2 に先行する」ことを表し、0 は「アイテム 1 がアイテムに等しい」ことを表す値を返します。 2」、+1 は「アイテム 1 はアイテム 2 に続く」と言います。データのルールに基づいて返される値を決定する比較を提供するだけです。任意のデータ セットを定義し、問題の「空間」内で希望する優先順位規則を定義できます。余談ですが、これはオブジェクト指向プログラミングの重要な部分です。この「コールバック」のアイデアを活用して、複雑なソート アルゴリズムの汎用バージョンを実装できます。ソートされるデータの数 - すべては、プログラマーがこの「既成の」ソート メカニズムを使用して、ソート ルーチンに必要な「論理的な配管」を提供するためです。

これは、言語にとらわれない方法で説明するための適切なショットだと思います。:)それが役立つことを願っています。

編集。例を挙げましょう:

List:

Item #  Value
1        12
2        15
3         9
4        26
5         4

リスト内の最小のアイテムを見つけようとすると、アイテム 1 から始めて、リスト内の残りの各アイテムと比較します。まず、アイテム 1 とアイテム 2 を比較します。

compare(item(1),item(2))

12 の値が15 よりも前にあるため、-1 が返されます。次に、リストの項目に移動します。

compare(item(1),item(3))

今回は 1 を返します。これは、12が 9 の後に続くためです。これは、item(3) がこれまでに見つかった最小のアイテムであることを意味します。さて、次のように比較します。

compare(item(3),item(4))

この場合、return -1 を比較します。これは、9 が 26 よりも前にあり、最終的な比較につながるためです。

compare(item(3),item(5))

9 は 4 の後に来るので、この呼び出しは +1 を返します。リスト内のすべての項目を使い果たしたので、item(3) が最小の項目であることがわかります。次に、そのアイテムを「前の」トップ アイテムと交換し、item(2) から始まるプロセス全体を繰り返します。これは、非効率なことで知られる「バブル ソート」の例ですが、この図の目的には有効です。これが、「最初の項目」と「2 番目の項目」の参照の由来です。並べ替えは、言語に関係なく、コンピューター サイエンスの他の問題と同様に、大きな問題を小さな断片に分解することであり、並べ替えとは、大きなリストから 2 つの項目を繰り返し比較することです。

于 2012-08-31T03:14:43.293 に答える
0

まず、マニュアルを読んでください。概要ページは、指定されたさまざまな種類を確認するのに適した場所です。いくつかの質問に答えるには:

もちろん、並べ替えはすべての配列要素をスキャンします。最後の要素がどこに配置される可能性があるかを、他にどのように知ることができますか? しかし、それは実際には関係ありません。どのソート アルゴリズムが使用されているかを理解する必要はありません。他の項目に関係なく、配列内の任意の 2 つの項目を比較する方法を知っている関数を提供するだけで済みます。

並べ替えアルゴリズムは魔法のように機能し、どの要素が他の要素よりも「前に来る」かを知りたいときはいつでも関数を呼び出します。それぞれがパラメーターとして 2 つの項目を使用して関数を呼び出します。

関数は次を返します。

  • 最初の項目が 2 番目の項目より小さい場合は -1 (または 0 未満の任意の数値)。
  • 等しい場合は 0
  • 最初の項目が 2 番目の項目より大きい場合は 1 (または 0 より大きい任意の数)。

任意のタイプの並べ替えを行うメソッドを作成できます。'w' を 'b' の前に置きたい場合、最初のパラメーターが 'w' で始まり、2 番目のパラメーターが 'b' で始まる場合、-1 を返します。サンプル関数をわざわざ書くには、あまりにも不自然な例です。

しかし、コールバックの書き方を学ぶ前に、達成すべき目標を達成するためにソートする理由が実際に必要です。

この例を実行して、並べ替え関数がコールバックを呼び出す回数を確認します。

<?php

function mysort($a, $b)
{
  echo "$a vs $b\n";

  return $a - $b;
}

// randomly create an array with 1 to 20 as elements
$data = range(1,20);
shuffle($data);    

// before
print_r($data);

// sort
usort($data, 'mysort');

// after   
print_r($data);

関数が 2 つの個別の項目の順序付け方法について指示する情報を使用して、並べ替えアルゴリズムを使用して配列を体系的に並べ替えます。

于 2012-08-31T03:20:15.193 に答える