先月、私はフォトモザイクのWebサイトに取り組んでいます。私はすべてをPHPで構築し、それをうまく機能させました。私が嫌いなのは実行時間だけです。線形比較検索のため、これは長すぎると思います。それで、私は検索時間を改善する方法について尋ねてきました、そしてほとんどの人は私をKDツリーの方向に向けました。それはk最近傍をはるかに速くします。
だから私はKDツリーを調べていて、そのようなツリーを手動で構築する方法を理解しています。もちろん、これをコーディングしたいのですが、C++とJavaのライブラリしか見つかりませんでした。私はPHPに精通しているだけなので、自分でPHPを作成しようとしていますが、これは思ったほど簡単ではありません。
•私が直面している問題は、すべてをどのように保存するかです。すべてのポイントを含む最初の配列を取得したら、それを3つに分割します。左ブランチ、ノード、右ブランチ。もちろん、分割できなくなるまで左のブランチでも同じことを行います。もちろん、軸(XYZ)を循環します。しかし、すべての正しいブランチをどのように格納しますか?それらを配列のままにしますか?または、使用する準備ができたら、もう一度計算しますか?
•私が疑問に思っていたもう1つのことは、PHPがこの仕事に適した言語ではないため、なぜPHPKDツリースクリプトがないのかということです。
これは私がこれまでに得たものです。
この関数は、残りをテストするために使用するランダムカラー(RGB)を計算します。
<?php
function randomiser($number){
if($number <= 0){
echo 'Error: The input of randomiser() is less than or equal to zero !!';
return FALSE;
}else{
$R = array();
$G = array();
$B = array();
for($x = 1; $x <= $number; $x++){
$r = rand(1, 255);
$g = rand(1, 255);
$b = rand(1, 255);
$rgb['pic ' . $x]['R'] = $r;
$rgb['pic ' . $x]['G'] = $g;
$rgb['pic ' . $x]['B'] = $b;
}
}
return $rgb;
}
?>
この関数は、特定のキーで多次元配列を並べ替えます(デフォルトはR)
<?php
function sorter(&$array, $key = 'R'){
if(!is_array($array)){
echo 'Error: The input of sorter() is not an array !!<br>';
return FALSE;
}else{
uasort($array, function ($a, $b) use ($key){
return strnatcmp($a[$key], $b[$key]);
});
}
}
?>
このクラスは、配列を左ブランチ、ノード、および右ブランチに分割します。
<?php
class splitting {
public $left;
public $node;
public $right;
function __construct($array){
if(!is_array($array)){
echo 'Error: The input of splitter() is not an array !!<br>';
return FALSE;
}else{
$number = count($array);
$median = round($number / 2) - 1;
$this->left = array_slice($array, 0, $median);
$this->node = array_slice($array, $median, 1);
$this->right = array_slice($array, $median+1);
}
}
}
?>