几种选择全排列实现的效率

全排列算法部分算法需要自己优化修改 全排列算法 立即下载

统计几种选择全排列实现的效率,所谓选择全排列,如:在4个球之间选择2个球,其全排列数为 6 。

代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;
int cnt, cct, tot, n, k;
char a[25];
void test_1(int cur)
{
    if(cnt == k)
    {
        ++tot;
        return ;
    }
    else if(cur == n)
    {
        ++cct;
        return ;
    }
    ++cnt;
    test_1(cur + 1);
    --cnt;
    test_1(cur + 1);
}
void test_2(int cur)
{
    if(n - cur < k - cnt)
    // 剪枝,剩下的数的个数小于所需的1的个数时,不需要继续往下走了,直接返回
    {
        ++cct;
        return ;
    }
    if(cnt == k)
    {
        ++cct;
        return ;
    }
    else if(cur == n)
    {
        ++cct;
        return ;
    }
    ++cnt;
    test_2(cur + 1);
    --cnt;
    test_2(cur + 1);
}
void test_3(int cur)
{
    if(n - cur < k - cnt)
    {
        ++cct;
        return ;
    }
    if(cur == n)
    {
        ++cct;
        return ;
    }
    if(cnt <= k)
    {
        ++cnt;
        test_3(cur + 1);
        --cnt;
        test_3(cur + 1);
    }
    else
        test_3(cur + 1);
}
int main()
{
    n = 16; // 样本总个数
    k = 1;  // 选择出的个数
    printf("%d 个数的全排列的总个数为:%d.\n", n, (int)pow(2, n));

    tot = cnt = cct = 0;
    test_1(0);
    printf("%d 个里面选 %d个的全排列的总个数 %d.\n", n, k, tot);
    printf("一般回溯法的实际运行次数为:%10d, ", cct + tot);
    printf("效率 :%.4lf%%。\n", (double)tot / (double)(cct + tot) * 100);

    cnt = cct = 0;
    test_2(0);
    printf("剪枝优化后的实际运行次数为:%10d, ",  cct);
    printf("效率 :%.4lf%%.\n",  (double)tot / (double)cct * 100);

    cct = cnt = 0;
    test_3(0);
    printf("剪枝优化后的实际运行次数为:%10d, ",  cct);
    printf("效率 :%.4lf%%.\n",  (double)tot / (double)cct * 100);
}


STM32进入HardFault_Handler时,如何找到问题所在? 当STM32进入HardFault_Handler时,定位问题发生的点 阅读详情

相关推荐

vit的cam和注意力图: VIT模型的可解释性

VIT的热力图怎么画

YI_SHU_JIA的博客 1万+

工作效率问题,1-n的全排列算法

简单问题,写的不好,大佬见谅.如有疏漏,恳请指正,小编垂首.这个全排列算法就很让人头大。

twfplayer的博客 159

H桥电路原理

一、H桥原理 图1中所示为一个典型的直流电机控制电路。电路得名于“H桥式驱动电路”是因为它的形状酷似字母H。4个三极管组成H的4条垂直腿,而电机就是H中的横杠(注意:图1及随后的两个图都只是示意图,而不是完整的电路图,其中三极管的驱动电路没有画出来)。   如图所示,H桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左...

Loadingzc的专栏 7万+

【C++学习笔记1】搜索与回溯算法的实际应用指南:全排列问题与优化技巧

详细讲解C++搜索与回溯算法~干货多多!

胖鹅の的博客 1153

边表法

边表法是用来绘制填充一个面的,边表法的关键是边表和连接边表的扫描线。 对于边的描述利用边表数据结构,包含边与扫描线的交点x坐标,边的最大y坐标,这样可以知道边加入到哪些扫描线上,便还有一个指针来记录扫描线上其它边。 //边数据结构 #pragma once #ifndef __CAETZ__ #define __CAETZ__ #include "pch.h" #include "CPoin...

weixin_42376458的博客 2102

【架构师面试-缓存与搜索-1】-缓存与缓存置换策略源码实现

1:什么是缓存 缓存:加速数据访问的存储,降低延迟(latency),提升吞吐量(Throughput)的利器。 1:缓存演进历史 1. 查库 2. ConcurrentHashMap 3. LRU 4. Guava Cache 5. 分布式缓存(redis,MemCache) 6. 多级缓存 2:在什么地方加缓存 缓存对于每个开发者来说是相当熟悉了,为了提高程序的性能我们会去加缓存,但是在什么地方加缓存,如何加缓存呢? 举个栗子:假设一个网站,需要提高性能,缓存可以放在浏览器,可以放

chongfa2008的博客 6440

全排列详解优化(去重+字典序)

全排列 一般的情况都是给出n个数,求出其不同顺序的排列方式; 全排列的实现 1.字典序法 根据全排列的公式,f(n)=n!不难推断出可以用DFS来求其所有不同的排列顺序;这种方法得出的顺序符号字典序排列。 这是它的生成树 代码实现 void DFS(int x){ if(x>=n){ for(int i=0;i<n;i++){ cout<<" "<<num[i]; } cout<<endl; return; } for(

高高冷的博客 1897

锐捷交换机配置SSH

锐捷交换机配置ssh 一、组网需求 通过ssh功能可以远程登录管理设备 二、配置步骤 全局开启ssh服务,并且指定ssh版本 Ruijie>enable Ruijie#configure terminal Ruijie(config)#enable service ssh-server ------>开启SSH服务,默认关闭 Ruijie(config)#ip ssh version 2 ------>默认1.99版本,设置为版本2 添加登

Loners_fan的博客 1万+

UVa 10152 - ShellSort

UVa 10152 - ShellSort 参考了GooMaple的解题报告, 想了

一只冰熊 703

【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇1(附项目源码)

生存和射击游戏一直是我的最爱,说起3D最普遍的应该就是射击系统了,你可以在任何情况下加入射击功能,所以我写下了这篇FPS开发记录。希望对你有帮助。在这个项目中,你将学习如何设计和实现射击系统、武器系统、玩家控制、场景设计等方面的内容。通过这个项目,你将深入了解游戏开发中的许多核心概念和技术,并且在实践中不断提升自己。本项目将带你从零开始逐步实现一个完整的第一人称射击游戏,并且会逐步引入一些高级功能,如特效、声音等。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 5500

【IC前端虚拟项目】spyglass lint环境组织与lint清理

和上个虚拟项目的lint清理环节一样,关于spyglass的lint清理功能与流程还是大家通过各种资料去学习下就好啦。和之前不同的事,这次的虚拟项目里我把流程封装为Makefile,更加的贴近了实际项目交付流程。而后就可以根据提示进行lint的清理工作了。

moon9999的博客 1886

解决全排列问题,以及八皇后代码优化(Java日记Ⅸ)

上一篇中我们讲了八皇后递归的思路,但是代码实在是不堪入目,因为从零到七要试探上千万次,简直无法忍受,而我们也知道八皇后的排列方式就是8!的全排列问题,由此可在上一篇的基础上进行代码优化进一步减少运行次数(但还不是最简方法),由原来的需要判断上千万次减少为40320次虽然还是很多,但对于计算机来说还是可以接受的。 代码以及说明如下: import java.util.ArrayList; import java.util.List; public class QueenDemo { publi

Error的博客 799

PCIe协议之 Equalization篇 之 理论篇 之 FFE

作为最后一道“精加工”工序,DFE利用其不放大噪声的优势,精准地消除残余的、强烈的后光标ISI,最终得到一个非常干净、张得很开的眼图,供判决器使用。信号经过信道衰减后变得模糊,首先由CTLE进行“粗调”,提供一个宽频带的增益,将眼图初步打开,为后面的DFE创造一个可以正常工作的信号环境。,它通过将输入信号在不同时间点上的多个副本(称为“抽头”)进行加权求和,来直接塑造或“整形”输出信号的波形。:这是最主要的信号路径,通常系数为正值,决定了信号的幅度。:将所有加权后的信号相加,产生最终的均衡输出。

那么菜的博客 756

奇妙的非递归算法取全排列

zhouwen5288的专栏 1532

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

回溯问题之全排列

本文介绍了回溯算法的基本概念及其在全排列问题中的应用。回溯可视为DFS的升级版,通过"撤回上一状态"来穷举所有可能解。针对全排列问题,重点讲解了剪枝优化策略(树层去重)和状态变量设计(used数组)。文章以LCR084和LCR157为例,详细分析了字符排列和数字排列的处理方法,包括排序预处理、交换法和used标记法的实现差异。特别指出字符串排列中通过交换位置和HashSet去重的技巧,同时承认回溯算法的抽象性,欢迎读者讨论补充理解难点。整体强调回溯=递归+状态撤销+剪枝的核心思想。

qq_55203530的博客 834

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

计算全排列的方法有哪些?

此外,还有一些其他方法如递增进位制数法、递减进位制数法、邻位对换法等也可以用于计算全排列,但它们在前端开发中的应用相对较少。在实际开发中,可以根据具体需求和场景选择合适的方法来计算全排列。在计算全排列的方法中,前端开发常用的几种方法包括递归法、字典序法、Heap算法等。这些方法可以根据不同需求和场景选择使用,以提高算法效率和可读性。需要注意的是,全排列的计算复杂度为O(n!),随着n的增大,计算量会迅速增加。因此,在处理大规模数据时,需要特别注意算法的性能和效率。

王铁柱666的博客 416

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

leetcode热题——全排列

回溯算法

2401_83194362的博客 1053

回溯算法精讲:从全排列问题掌握C++实现与核心思想

回溯算法是解决组合优化与搜索问题的核心范式,其本质是一种通过递归进行系统化试错与状态回退的深度优先搜索策略。该算法的通用框架遵循“选择-递归-撤销”的固定模式,能高效枚举解空间并利用剪枝避免无效搜索,在算法设计与面试中具有极高的技术价值。回溯的典型应用场景包括排列组合生成、子集构造、N皇后及数独求解等经典问题。本文以LeetCode高频考题“全排列”为切入点,深入剖析其C++实现细节,涵盖标记数组、原地交换等核心方法,并详解递归参数设计、调试技巧与复杂度分析,帮助读者从一道经典OJ题出发,彻底掌握回溯算法的

weixin_30410119的博客 395

Gemini永久会员 几种Python中实现字符串全排列(所有可能的排序)的方法

这些方法可以根据具体需求选择使用,对于学习算法原理,推荐从递归方法开始理解。

m0_37843156的博客 71

回溯算法实战:用Python解决LeetCode全排列问题(附剪枝技巧)

本文详细介绍了如何使用Python实现回溯算法解决LeetCode全排列问题,包括基础回溯实现、状态跟踪调试技巧以及剪枝优化方法。通过具体代码示例和实战技巧,帮助开发者深入理解回溯算法的核心思想和应用场景,提升算法面试表现。

weixin_33725126的博客 345

随机排列算法(Fisher-Yates)

之前写随机的时候,不管是在打OI的那段时间还是在写游戏的那段时间,用的随机选择(不允许重复)算法都是很笨的。这里总结一下我用过的随机选择算法并且提一下Fisher-Yates洗牌算法。 (前三种做法都是我自己用过的, 估计也不会是什么有趣有用的算法,不过这里写出来权当开拓眼界和记录思路,实在懒的写并且没有什么特别严格的要求的话这些做法也能勉强达到效果) 暴力 没啥技术含量,就是维护一个vis数组,每次rand一个1到n的数,然后判断是不是已经vis过了,据此判断下一位应该选谁。 这样的思路有很大的问题。当所

Magic Automaton的博客 2480

C++回溯算法精讲:从全排列问题掌握算法核心与工程实践

回溯算法是解决组合优化与搜索问题的核心技术,其本质是深度优先搜索(DFS)在解空间树上的系统尝试与回退。通过构建路径、管理状态与剪枝,它能高效枚举所有可行解,在算法面试与工程开发中价值显著。本文以经典的**全排列**问题为切入点,深入剖析其C++实现,涵盖时间复杂度分析、含重复数字变种处理以及**next_permutation**等实用技巧,帮助读者从原理到实践全面掌握回溯模板,并自然延伸到组合、子集等更复杂的应用场景。

weixin_34033624的博客 327

10个地区比较法方法排序C语言,c语言排序算法(c语言选择排序法详解)

请教下C中对于数据多,处理效率较高的排序法及其实际如何编写,运用c语言中排序法有选择法和冒泡法是最常见的。1冒泡法对10个数排序#include voidmain() {inta[10]; inti,j,t; printf("pleaseinput10numbers:\n"); for(i=0;i<10;i++) .Description 对于任意给定的5个整数,请按从小到大的顺序排序。整数...

weixin_39664560的博客 662

基于Python的数独游戏设计与实现 课程文档+任务书+项目源码

本文转载自:http://www.biyezuopin.vip/onews.asp?

毕业作品网站 2493

solr入门之搜索建议的几种实现方式和最终选取实现思路

上篇博客中我简单的讲了下solr自身的suggest模块来实现搜索建议.但是今天研究了下在solr自身的suggest中添加进去拼音来智能推荐时不时很方便.在次从网上搜集和整理思考了下该问题的解决. http://www.cnblogs.com/huangfox/p/4146970.html 问题背景 搜索关键字智能提示是一个搜索应用的标配,主要作用是避免用户输入错误

筑梦者 9847

c语言刷题洛谷P1036 [NOIP2002 普及组] 选数(深度优先算法搜索)

c语言刷题洛谷P1036 [NOIP2002 普及组] 选数,深度优先算法应用实例,质数判断

qq_64426102的博客 3381
上一篇: HDU 4403 A very hard Aoshu problem
下一篇: UVa 10591 - Happy Number
GooMaple
博客等级 码龄14年 79粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值