返回

从数组中获取数字的唯一组合:防止重复的高效算法

php

从数组中获取数字的唯一组合

问题

从素数数组中随机选择四个数字,并生成这些数字乘积的所有唯一组合。

挑战

原始代码未能生成唯一的产品,因为重复的组合被多次生成。

解决方案

通过创建键数组 $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:此代码适用于任何大小的数组,但对于非常大的数组,生成所有可能组合的计算成本可能会很高。