Tôi đang tìm để tìm hiểu xem một thuật toán cụ thể đã tồn tại hay chưa. Tôi muốn sử dụng nó trong một ứng dụng, nhưng tôi cũng thấy điều này xuất hiện trong một số vấn đề Project Euler.Thuật toán - tạo tất cả các kết hợp từ các mục phải được chọn theo thứ tự
Tôi đang tìm cách tính toán loại bộ hoán vị/đầu ra cụ thể, trong đó mục tiếp theo được chọn phải là là một trong số các tùy chọn hữu hạn chỉ trong tập hợp sau.
Ví dụ, nói rằng tôi đã có 3 mảng
$a1 = array("a", "b", "c");
$a2 = array("d", "e", "f");
$a3 = array("g", "h", "i");
tôi đang tìm cách để tạo ra tất cả các khả năng của một chuỗi có chứa yếu tố nhiều nhất là 1 từ mỗi mảng, chọn để. Đó là để nói là đầu ra, tôi muốn thấy:
adg aeg afg
adh aeh afh
adi aei afi
bdg beg bfg
bdh beh bfh
bdi bei bfi
cdg ceg cfg
cdh ceh cfh
cdi cei cfi
Tìm cách triển khai thuật toán bằng PHP hoặc Javascript. Về bản chất, nó sẽ trải qua một số lượng các mảng có chứa một số lượng biến số của các phần tử và xuất ra tất cả các khả năng của các chuỗi có thể xảy ra theo thứ tự tuần tự.
Điều này có tồn tại không?
Nếu có, nó được gọi là gì? Về mặt kỹ thuật, đây không phải là một hoán vị hay sự kết hợp từ những gì tôi biết về cả hai.
EDIT: Daniel Fischer đã thông báo với tôi đây là một sản phẩm Descartes, đây là một thực hiện taken from the PHP website:
function array_cartesian_product($arrays)
{
$result = array();
$arrays = array_values($arrays);
$sizeIn = sizeof($arrays);
$size = $sizeIn > 0 ? 1 : 0;
foreach ($arrays as $array)
$size = $size * sizeof($array);
for ($i = 0; $i < $size; $i ++)
{
$result[$i] = array();
for ($j = 0; $j < $sizeIn; $j ++)
array_push($result[$i], current($arrays[$j]));
for ($j = ($sizeIn -1); $j >= 0; $j --)
{
if (next($arrays[$j]))
break;
elseif (isset ($arrays[$j]))
reset($arrays[$j]);
}
}
return $result;
}
Phải, tuy nhiên tôi đang tìm cách trừu tượng khái niệm để tôi có thể chạy nó dựa trên số lượng mảng thay đổi. – barfoon