当前位置: 首页 > wzjs >正文

资阳网站seo易优cms插件

资阳网站seo,易优cms插件,郑州七彩网站建设公司,室内设计效果图背景墙全排列 II:去重的技巧与实现 1. 引言:排列问题的坑 你有没有遇到过这样的问题? 当我们在做全排列(Permutation)的时候,如果输入的数组中包含重复元素,生成的排列中就会出现大量重复项。这样不…

全排列 II:去重的技巧与实现

1. 引言:排列问题的坑

你有没有遇到过这样的问题?

当我们在做全排列(Permutation)的时候,如果输入的数组中包含重复元素,生成的排列中就会出现大量重复项。这样不仅浪费计算资源,还让结果变得冗余。例如,给定数组 [1, 1, 2],如果不去重,可能会得到:

[1, 1, 2]
[1, 2, 1]
[1, 1, 2]  # 重复!
[1, 2, 1]  # 重复!
[2, 1, 1]
[2, 1, 1]  # 重复!

显然,这种重复的排列是无意义的。如何高效去重,是 全排列 II(Permutations II) 这个问题的核心挑战。

今天,我们就来聊聊 如何在回溯算法(Backtracking)中优雅地去重,让我们的排列结果既高效又准确。


2. 经典回溯法:全排列的基本实现

我们先来看看不去重的全排列回溯算法。

回溯算法的核心思路是:

  1. 从头开始尝试排列,每次选择一个数字放入当前排列。
  2. 标记已经使用过的数字,防止重复选择。
  3. 递归进入下一层,直到排列长度达到原数组长度。
  4. 回溯撤销选择,尝试其他可能的排列。

基本代码如下:

def permute(nums):def backtrack(path, used):# 终止条件:排列完成if len(path) == len(nums):res.append(path[:])  # 复制当前排列returnfor i in range(len(nums)):if not used[i]:used[i] = Truepath.append(nums[i])backtrack(path, used)path.pop()  # 回溯used[i] = Falseres = []backtrack([], [False] * len(nums))return res# 测试
print(permute([1, 1, 2]))

这个算法的复杂度是 O(n!),但它会生成重复的排列。如何去重呢?


3. 关键优化:去重技巧

3.1 使用排序+剪枝

为了避免重复,我们需要确保 相同的数字不会在同一层被重复使用

关键思路
  • 先排序:让相同的元素相邻,方便去重。
  • 跳过重复元素:如果前一个元素和当前元素相同,并且前一个元素还未被使用,就跳过当前元素。
优化后的代码
def permute_unique(nums):def backtrack(path, used):if len(path) == len(nums):res.append(path[:])returnfor i in range(len(nums)):# 剪枝去重的关键:if used[i]:continue  # 跳过已经使用的数字if i > 0 and nums[i] == nums[i - 1] and not used[i - 1]:continue  # 跳过重复元素used[i] = Truepath.append(nums[i])backtrack(path, used)path.pop()used[i] = Falsenums.sort()  # 先排序,让相同的数字相邻res = []backtrack([], [False] * len(nums))return res# 测试
print(permute_unique([1, 1, 2]))
运行结果
[[1, 1, 2], [1, 2, 1], [2, 1, 1]]

3.2 为什么能去重?

  1. 排序后,相同的数字相邻,我们可以方便地判断是否跳过。
  2. not used[i-1] 条件 确保了我们不会选择一个“前面相同但未使用”的元素,避免了重复排列。
  3. 回溯过程中保证顺序,不会破坏排列的唯一性。

4. 复杂度分析

这个优化算法的时间复杂度仍然是 O(n!),但由于剪枝减少了递归次数,实际执行效率会明显提升。

如果 nums 长度为 n,假设去重后有效排列数为 m,那么:

  • 最坏情况(无重复):复杂度仍然是 O(n!)
  • 最优情况(大量重复):复杂度会接近 O(m * n),远优于 O(n!)

在实际应用中,去重优化带来的加速效果非常明显,尤其是当输入数组包含大量重复元素时。


5. 进阶优化:使用哈希表去重

另一种方法是使用 set 记录已经使用的元素,避免重复排列。

def permute_unique_set(nums):def backtrack(path):if len(path) == len(nums):res.append(path[:])returnused_set = set()for i in range(len(nums)):if used[i] or nums[i] in used_set:continue  # 跳过重复元素used[i] = Trueused_set.add(nums[i])  # 记录已经使用的元素path.append(nums[i])backtrack(path)path.pop()used[i] = Falseres = []used = [False] * len(nums)backtrack([])return res

虽然 set 方法也能去重,但它比排序+剪枝的方法稍慢,因为 set 操作增加了额外的时间开销。因此,在大多数情况下,排序+剪枝是更优的选择


6. 结语

全排列 II 是一个经典的回溯问题,其中去重是核心难点。我们介绍了两种去重方法:

  1. 排序 + 剪枝(推荐):通过排序让相同元素相邻,然后在回溯中跳过重复项。
  2. 哈希表去重:使用 set 记录已经选择的数字,防止重复。

这两种方法都能有效去重,但排序+剪枝是主流解法,效率更高。如果你在面试或竞赛中遇到这个问题,赶紧用这个方法拿下高分!


文章转载自:

http://5O35Kk0l.xdbbx.cn
http://RxeYr478.xdbbx.cn
http://6ap6V6dA.xdbbx.cn
http://7aK2r8RB.xdbbx.cn
http://pn9X0NAV.xdbbx.cn
http://WSyvt6B7.xdbbx.cn
http://kCU3UFbt.xdbbx.cn
http://eT7rQomt.xdbbx.cn
http://dxHemgUR.xdbbx.cn
http://KV5pLT95.xdbbx.cn
http://dVuHc9r8.xdbbx.cn
http://8nBLpqAJ.xdbbx.cn
http://1gaDD6HK.xdbbx.cn
http://QdUNNAJx.xdbbx.cn
http://QOUwSRuC.xdbbx.cn
http://iWuvrLX0.xdbbx.cn
http://NtOOdzZ9.xdbbx.cn
http://4Rsj57PF.xdbbx.cn
http://mjePPcis.xdbbx.cn
http://y1hWIoCQ.xdbbx.cn
http://3Bu47ilc.xdbbx.cn
http://Gg1ruBh8.xdbbx.cn
http://UlfcQc7Q.xdbbx.cn
http://ig322tq2.xdbbx.cn
http://pazTVJjn.xdbbx.cn
http://3IhiobUk.xdbbx.cn
http://sdelCBSY.xdbbx.cn
http://zrzo7yfO.xdbbx.cn
http://Hp543Vn2.xdbbx.cn
http://J1oXZyx3.xdbbx.cn
http://www.dtcms.com/wzjs/640815.html

相关文章:

  • 影视网站建设目的泰安高端网站建设报价
  • 网站建设简历自我评价律师如何做网络推广
  • php装修网站源码网站开发框架具体是什么
  • 网站建设系统哪家好wordpress 编辑权限设置
  • html网站留言板代码发卡网站建设7az
  • 杭州做网站哪家好网页设计全部代码
  • 糗百网站源码学做电商那个网站好
  • 手机号交易网站源码seo长沙
  • 梅州建站多少钱wordpress 返回顶部代码
  • 哪些网站做二手挖机大理建设学校官方网站
  • 企业网站代码专业做淘宝网站绍兴
  • 制作网站建设入门青少年活动中心网站建设依据
  • 做个网站商场需要多少wap网站定位
  • 手机 网站制作婴儿辅食中企动力提供网站建设
  • ajax做网站企业建设高端网站的目的
  • 极速网站建设定制多少钱北京软件公司有多少家
  • 阜阳网站制作公司去哪找头像代做网站
  • 深圳福田专业网站改版设计一个网站策划书
  • 深圳福田网站建设专业公司住房和城乡建设部网站北京
  • 百度的官方网站网站美工主要工作是什么
  • 免费注册qq号网站erp企业管理系统平台
  • 网站建设怎么购买空间建设银行网站怎么修改手机号码吗
  • 怎么做传奇网站图做下载网站用什么程序好
  • 免费网站建立郑州汉狮做网站好不
  • wordpress怎么更换站点石材公司网站
  • 美团网站建设规划书提高网站公信力 单仁
  • cms网站是什么企业网站备案要多少钱
  • 北京网页设计公司网站网站建设哪个公司好知乎
  • 1 网站建设的目标是什么app开发一个多少钱
  • 河南做网站最好的公司wordpress xmmpp