SplFixedArray
クラスのインスタンスで整数または文字列をソートする方法はありますか? PHPのarray
に変換し、ソートしてから唯一のオプションに変換していますか?SplFixedArrayをソートする方法は?
答えて
まず、SplFixedArraysを見つけて使用していただきありがとうございます。私は彼らがバニラのPHPで非常に活用されていない機能だと思う...
あなたはおそらく評価されているように、彼らのパフォーマンスは(通常のPHP配列に比べて)比類ない - しかし、これはいくつかのトレードオフ、それらを並べ替えるPHP関数の欠如を含む(これは残念です)!
バブルソートの実装は、比較的簡単で効率的なソリューションです。各要素の連続したペアを見て、最も高いものを右側に置くだけで、繰り返し実行できます。アレイがソートされるまでリンスし、繰り返します。
<?php
$arr = new SplFixedArray(10);
$arr[0] = 2345;
$arr[1] = 314;
$arr[2] = 3666;
$arr[3] = 93;
$arr[4] = 7542;
$arr[5] = 4253;
$arr[6] = 2343;
$arr[7] = 32;
$arr[8] = 6324;
$arr[9] = 1;
$moved = 0;
while ($moved < sizeof($arr) - 1) {
$i = 0;
while ($i < sizeof($arr) - 1 - $moved) {
if ($arr[$i] > $arr[$i + 1]) {
$tmp = $arr[$i + 1];
$arr[$i + 1] = $arr[$i];
$arr[$i] = $tmp;
}
$i++;
var_dump ($arr);
}
$moved++;
}
これは高速ではありません。効率的ではありません。 Quicksortについては、wikibooks.orgにこれを含めてオンラインで文書化されている例があります(SplFixedArraysを使用するための修正が必要です)。
本当にあなたの質問を解決することを超えて、私は本当にSplFixedArrayのようなものが存在し、「array_sort()
への迅速な呼び出し」の後ろで何が起こっているのか理解するように強要していると感じています実行する時間)はプログラマーとプログラマーの違いになります。私はあなたの質問に拍手喝采!
ブラインドでバブルソートを使用する'SplFixedArray'のためには、固定配列をそれ自身として使うことのメリットをすべて排除する考え方があるかもしれません。 PHPが単独でどれくらい多くのケース(https://github.com/php/php-src/blob/250938e2d35fc54161a18167b7901c5e3b574371/Zend/zend_sort.c)を調べているのでしょうか(よく、7.xブランチにあります)。 – mente
私はSplFixedArrayでクイックソートを一度実装して、パフォーマンスのヒットを調べました。私はアルゴリズムを最適化するために最善を尽くしたが、PHP自体のオーバーヘッドのせいで実験全体が短くなった。 – Flosculus
@Flosculus - あなたはここにコードを投稿しても構わないと思いますか?私は本当にあなたがしたことを見て、あなたのパフォーマンスの結果を見ることに興味があります。 – wally
ここでは、splFixedArraysを使用したバブルソートの私の適応です。 PHP 7では、このシンプルなプログラムは普通のバブルトートの2倍の速さです。
function bubbleSort(SplFixedArray $a)
{
$len = $a->getSize() - 1;
$sorted = false;
while (!$sorted) {
$sorted = true;
for ($i = 0; $i < $len; $i++)
{
$current = $a->offsetGet($i);
$next = $a->offsetGet($i + 1);
if ($next < $current) {
$a->offsetSet($i, $next);
$a->offsetSet($i + 1, $current);
$sorted = false;
}
}
}
return $a
}
$starttime = microtime(true);
$array = SplFixedArray::fromArray([3,4,1,3,5,1,92,2,4124,424,52,12]);
$array = bubbleSort($array);
print_r($array->toArray());
echo (microtime(true) - $starttime) * 1000, PHP_EOL;
- 1. ソートする方法
- 2. Iterableをソートする方法
- 3. ArrayListをソートする方法
- 4. mysqlをソートする方法
- 5. Rubyのハッシュをソートする方法は?
- 6. テーブルをソートする方法は?
- 7. options_for_selectハッシュをソートする方法は?
- 8. このリストをソートする方法は?
- 9. NSMutableArrayをソートする方法は?
- 10. JavaScriptでリストをソートする方法は?
- 11. QTableViewを列でソートする方法は?
- 12. 値でハッシュマップをソートする方法は?
- 13. グループのソート、ソート、ソートの値をマップする方法
- 14. JQuery UIをソート可能にアルファベット順にソートする方法は?
- 15. ソートする方法マップ
- 16. ListViewでソートする方法は?
- 17. mutablensarrayのソート方法は?
- 18. オーバーライド方法Enumerablesソート方法
- 19. 別の配列をソートする方法に基づいて1つの配列をソートする方法は? (JavaScript)
- 20. JavaScript - 部門をソートする方法
- 21. LARGE辞書をソートする方法
- 22. LinkedListをソートする方法<String>?
- 23. MKMapViewでアノテーションをソートする方法
- 24. LevelDBを値でソートする方法
- 25. データセットスキーマでデータテーブルをソートする方法
- 26. オブジェクトのarraylistをソートする方法java?
- 27. Ruby on Rails:collection_selectをソートする方法
- 28. ベクトルをソートする方法<char*>?
- 29. findAll Doctrineのメソッドをソートする方法
- 30. C#でリストをソートする方法
はい。 PHPのネイティブソート関数は、オブジェクト配列では機能しません。回避策や手動によるコーディングが必要です:http://phppowercoding.com/the-speed-issue-orternately-why-a-php-implemented-quicksorts-not-so-quick/397 – mario