返回
从数组中获取数字的唯一组合:防止重复的高效算法
php
2024-03-20 09:38:41
从数组中获取数字的唯一组合
问题
从素数数组中随机选择四个数字,并生成这些数字乘积的所有唯一组合。
挑战
原始代码未能生成唯一的产品,因为重复的组合被多次生成。
解决方案
通过创建键数组 $seen
来跟踪已经生成的组合,解决了重复问题。每个组合的键是其元素的排序字符串表示。在生成每个新组合之前,检查 $seen
数组中是否存在其键。如果存在,则跳过该组合。
修改后的代码
function getUniqueRandomProductsWithNumbers($arr, $n) {
$seen = array(); // Store seen combinations to avoid duplicates
$productsWithNumbers = array();
while (count($productsWithNumbers) < pow(count($arr), $n)) {
$selected = array_rand($arr, $n); // Get random indexes
sort($selected); // Sort to ensure order for checking duplicates
$key = implode(",", $selected); // Create a unique key based on sorted indexes
if (!isset($seen[$key])) {
$product = 1;
$numbers = array();
foreach ($selected as $i) {
$product *= $arr[$i];
$numbers[] = $arr[$i];
}
$seen[$key] = true;
$productsWithNumbers[] = array($numbers, $product);
}
}
return $productsWithNumbers;
}
优点
- 通过
$seen
数组保证了组合的唯一性。 - 代码易于理解和扩展。
- 生成所有可能的唯一组合。
结论
这个经过修改的代码有效地解决了原始问题,提供了素数数组中四位数字所有唯一乘积的组合。使用键数组跟踪已经生成的组合是一个优雅的解决方案,确保了结果的准确性。
常见问题解答
Q1:此代码是否适用于任何类型的数组?
A1:是的,只要数组中包含数字,此代码就可以用于任何类型的数组。
Q2:我怎样知道我得到了所有可能的组合?
A2:代码中的循环将继续运行,直到达到 $productsWithNumbers
数组的最大可能长度。如果到达该长度,则代码已经找到了所有可能的组合。
Q3:此代码是否会处理重复的数字?
A3:此代码不会处理重复的数字,因为它假设数组中没有重复的数字。如果数组中存在重复的数字,则代码可能会生成重复的组合。
Q4:我可以将此代码修改为生成不同数量的组合吗?
A4:是的,您可以通过更改 $n
的值来修改代码以生成不同数量的组合。
Q5:此代码是否适用于大数组?
A5:此代码适用于任何大小的数组,但对于非常大的数组,生成所有可能组合的计算成本可能会很高。