Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk menyelesaikan masalah pokok rentang minimum dalam PHP menggunakan kaedah divide-and-conquer dan mendapatkan penyelesaian yang optimum?
Bagaimana cara menggunakan kaedah bahagi dan takluk untuk menyelesaikan masalah pokok rentang minimum dalam PHP dan mendapatkan penyelesaian yang optimum?
Pokok rentang minimum ialah masalah klasik dalam teori graf, yang bertujuan untuk mencari subset semua bucu dalam graf bersambung, dan menyambungkan tepi supaya subset itu membentuk pokok, dan hasil tambah berat semua tepi ialah terkecil. Kaedah divide-and-conquer ialah idea untuk menguraikan masalah besar kepada beberapa sub-masalah, kemudian menyelesaikan sub-masalah satu demi satu dan akhirnya menggabungkan hasilnya. Menggunakan kaedah divide-and-conquer untuk menyelesaikan masalah pokok rentang minimum dalam PHP boleh dicapai dengan mengikuti langkah-langkah berikut.
Pertama, kita perlu mentakrifkan struktur data graf. Graf boleh diwakili menggunakan tatasusunan dan tatasusunan dua dimensi, di mana tatasusunan mewakili bucu dan tatasusunan dua dimensi mewakili tepi. Atribut lain seperti pemberat boleh ditambah mengikut keperluan sebenar.
class Graph { public $vertices; public $edges; public function __construct($vertices) { $this->vertices = $vertices; $this->edges = array(); } public function addEdge($u, $v, $weight) { $this->edges[] = array("u" => $u, "v" => $v, "weight" => $weight); } }
Seterusnya, kita perlu melaksanakan algoritma bahagi-dan-takluk untuk menyelesaikan pokok rentang minimum. Langkah-langkah khusus adalah seperti berikut:
Berikut ialah contoh kod untuk menyelesaikan masalah pokok rentang minimum menggunakan kaedah bahagi-dan-takluk:
function minSpanningTree($graph) { // 基准情况:图只有一个顶点 if ($graph->vertices == 1) { return array(); } // 选择两个子图 $subgraph1 = new Graph($graph->vertices / 2); $subgraph2 = new Graph($graph->vertices - $graph->vertices / 2); // 将边分配给子图 foreach ($graph->edges as $edge) { if ($edge["v"] <= $graph->vertices / 2) { $subgraph1->addEdge($edge["u"], $edge["v"], $edge["weight"]); } else { $subgraph2->addEdge($edge["u"], $edge["v"] - $graph->vertices / 2, $edge["weight"]); } } // 递归求解子图的最小生成树 $tree1 = minSpanningTree($subgraph1); $tree2 = minSpanningTree($subgraph2); // 合并两个子图的最小生成树 $tree = array_merge($tree1, $tree2); // 返回最小生成树 return $tree; }
Akhir sekali, kita boleh menggunakan algoritma di atas untuk menyelesaikan pokok rentang minimum masalah dan mendapatkan penyelesaian yang optimum. Berikut ialah contoh ujian mudah:
// 创建一个带权重的无向图 $graph = new Graph(4); $graph->addEdge(1, 2, 1); $graph->addEdge(1, 3, 2); $graph->addEdge(2, 3, 3); $graph->addEdge(2, 4, 4); $graph->addEdge(3, 4, 5); // 求解最小生成树 $tree = minSpanningTree($graph); // 输出最小生成树的边和权重 foreach ($tree as $edge) { echo $edge["u"] . "-" . $edge["v"] . " weight: " . $edge["weight"] . " "; }
Menjalankan kod di atas akan menghasilkan keputusan berikut:
1-2 weight: 1 2-3 weight: 3 3-4 weight: 5
Seperti yang anda lihat, menggunakan kaedah divide-and-conquer untuk menyelesaikan masalah pokok rentang minimum, kami berjaya memperoleh minimum merentangi pokok graf dan mendapat penyelesaian yang optimum.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah pokok rentang minimum dalam PHP menggunakan kaedah divide-and-conquer dan mendapatkan penyelesaian yang optimum?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!