全排列的不同写法(茴字的不同写法)及对应的时间开销

news2024/11/18 3:33:55

资源课件:

  1. CS106B-recursion-ppt
  2. stanford library-timer.h
  3. stanford library-set.h

不同的方法

1------

在这里插入图片描述

Set<string> permutations1Rec(string remaining) {
    Set<string> res;
    if(remaining.size() == 0) {
        res += "";
    }
    else {
        for(int i = 0; i < remaining.size(); ++i) {
            char selectCharacter = remaining[i];
            string newRemaining = remaining.substr(0, i) + remaining.substr(i+1);
            Set<string> subres = permutations1Rec(newRemaining);
            for(auto str : subres) {
                res += selectCharacter + str;
            }
        }
    }
    return res;
}

void permutations1(const string &str) {
    Set<string> res = permutations1Rec(str);
    cout << res << endl;
}

2------在这里插入图片描述

Set<string> permutations2Rec(string remaining) {
    Set<string> res;
    if(remaining.size() == 0) {
        res += "";
    }
    else {
        char firstCharacter = remaining[0];
        string newRemaining = remaining.substr(1);
        Set<string> subres = permutations2Rec(newRemaining);
        for(string subpermutation : subres) {
            for(int i = 0; i <= subpermutation.size(); ++i) {
                string subpermutationCp = subpermutation;
                subpermutationCp.insert(subpermutationCp.begin() + i, firstCharacter);
                res += subpermutationCp;
            }
        }
    }
    return res;
}

void permutations2(const string &str) {
    Set<string> res = permutations2Rec(str);
    cout << res << endl;
}

3------

在这里插入图片描述

Set<string> permutations3Rec(string str, int pos) {
    Set<string> res;
    if(pos == str.size()) {
        res += str;
    }
    else {
        for(int i = pos; i < str.size(); ++i) {
            if(i == pos || str[i] != str[pos]) {
                swap(str[i], str[pos]);
                res += permutations3Rec(str, pos+1);
                swap(str[i], str[pos]);
            }
        }
    }
    return res;
}

void permutations3(const string &str) {
    Set<string> res = permutations3Rec(str, 0);
    cout << res << endl;
}

4------

在这里插入图片描述

Set<string> permutations4Rec(string remaining,
                             string alreadyMade) {
    Set<string> res;
    if(remaining.size() == 0) {
        res += alreadyMade;
    }
    else {
        for(int i = 0; i < remaining.size(); ++i) {
            string newRemaining = remaining.substr(0, i) + remaining.substr(i+1);
            res += permutations4Rec(newRemaining, alreadyMade+remaining[i]);
        }
    }
    return res;
}

void permutations4(const string &str) {
    Set<string> res = permutations4Rec(str, "");
    cout << res << endl;
}

运行代码

其中X为不同写法,permutationsXRec为具体实现函数,permutationsX为wrapper 函数。

#include <iostream>
#include "set.h"
#include "timer.h"
using namespace std;

Set<string> permutations1Rec(string remaining) {
    Set<string> res;
    if(remaining.size() == 0) {
        res += "";
    }
    else {
        for(int i = 0; i < remaining.size(); ++i) {
            char selectCharacter = remaining[i];
            string newRemaining = remaining.substr(0, i) + remaining.substr(i+1);
            Set<string> subres = permutations1Rec(newRemaining);
            for(auto str : subres) {
                res += selectCharacter + str;
            }
        }
    }
    return res;
}

void permutations1(const string &str) {
    Set<string> res = permutations1Rec(str);
    cout << res << endl;
}



Set<string> permutations2Rec(string remaining) {
    Set<string> res;
    if(remaining.size() == 0) {
        res += "";
    }
    else {
        char firstCharacter = remaining[0];
        string newRemaining = remaining.substr(1);
        Set<string> subres = permutations2Rec(newRemaining);
        for(string subpermutation : subres) {
            for(int i = 0; i <= subpermutation.size(); ++i) {
                string subpermutationCp = subpermutation;
                subpermutationCp.insert(subpermutationCp.begin() + i, firstCharacter);
                res += subpermutationCp;
            }
        }
    }
    return res;
}

void permutations2(const string &str) {
    Set<string> res = permutations2Rec(str);
    cout << res << endl;
}

Set<string> permutations3Rec(string str, int pos) {
    Set<string> res;
    if(pos == str.size()) {
        res += str;
    }
    else {
        for(int i = pos; i < str.size(); ++i) {
            if(i == pos || str[i] != str[pos]) {
                swap(str[i], str[pos]);
                res += permutations3Rec(str, pos+1);
                swap(str[i], str[pos]);
            }
        }
    }
    return res;
}

void permutations3(const string &str) {
    Set<string> res = permutations3Rec(str, 0);
    cout << res << endl;
}



Set<string> permutations4Rec(string remaining,
                             string alreadyMade) {
    Set<string> res;
    if(remaining.size() == 0) {
        res += alreadyMade;
    }
    else {
        for(int i = 0; i < remaining.size(); ++i) {
            string newRemaining = remaining.substr(0, i) + remaining.substr(i+1);
            res += permutations4Rec(newRemaining, alreadyMade+remaining[i]);
        }
    }
    return res;
}

void permutations4(const string &str) {
    Set<string> res = permutations4Rec(str, "");
    cout << res << endl;
}

int main() {
    Timer tim;

    tim.start();
    cout << "....." << endl;
    tim.stop();
    cout << "The code took " << tim.elapsed() << "ms to finish." << endl;

    tim.start();
    permutations1("123");
    tim.stop();
    cout << "The code took " << tim.elapsed() << "ms to finish." << endl;

    tim.start();
    permutations2("123");
    tim.stop();
    cout << "The code took " << tim.elapsed() << "ms to finish." << endl;

    tim.start();
    permutations3("123");
    tim.stop();
    cout << "The code took " << tim.elapsed() << "ms to finish." << endl;

    tim.start();
    permutations4("123");
    tim.stop();
    cout << "The code took " << tim.elapsed() << "ms to finish." << endl;





    return 0;
}



The code took 34ms to finish.
{“123”, “132”, “213”, “231”, “312”, “321”}
The code took 2ms to finish.
{“123”, “132”, “213”, “231”, “312”, “321”}
The code took 2ms to finish.
{“123”, “132”, “213”, “231”, “312”, “321”}
The code took 2ms to finish.
{“123”, “132”, “213”, “231”, “312”, “321”}
The code took 3ms to finish.

时间测试(非正式)

int main() {
    Timer tim;

    tim.start();
    cout << "....." << endl;
    tim.stop();
    cout << "The code took " << tim.elapsed() << "ms to finish." << endl;

    tim.start();
    permutations1("12345678");
    tim.stop();
    cout << "The code-1 took " << tim.elapsed() << "ms to finish." << endl;

    tim.start();
    permutations2("12345678");
    tim.stop();
    cout << "The code-2 took " << tim.elapsed() << "ms to finish." << endl;

    tim.start();
    permutations3("12345678");
    tim.stop();
    cout << "The code-3 took " << tim.elapsed() << "ms to finish." << endl;

    tim.start();
    permutations4("12345678");
    tim.stop();
    cout << "The code-4 took " << tim.elapsed() << "ms to finish." << endl;


    tim.start();
    permutations1("12345678");
    tim.stop();
    cout << "The code-1 took " << tim.elapsed() << "ms to finish." << endl;

    tim.start();
    permutations2("12345678");
    tim.stop();
    cout << "The code-2 took " << tim.elapsed() << "ms to finish." << endl;

    tim.start();
    permutations3("12345678");
    tim.stop();
    cout << "The code-3 took " << tim.elapsed() << "ms to finish." << endl;

    tim.start();
    permutations4("12345678");
    tim.stop();
    cout << "The code-4 took " << tim.elapsed() << "ms to finish." << endl;

    return 0;
}

The code took 38ms to finish.
The code-1 took 1150ms to finish.
The code-2 took 279ms to finish.
The code-3 took 1077ms to finish.
The code-4 took 1135ms to finish.
The code-1 took 1141ms to finish.
The code-2 took 279ms to finish.
The code-3 took 1071ms to finish.
The code-4 took 1129ms to finish.

感受

  • 其实第一种方法和第四种方法它们思想是几乎一致的,从时间上它们也很接近。
  • 第三种方法比1、4快些,但是函数调用依旧在for循环里,开销较大。
  • 第二种方法函数调用在for循环外面,节省了很多时间。似乎也更好理解一些?
  • 这里纯属娱乐,学的比较晕,记录一下~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1526035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

django管理日志记录(日志审计django_admin_log)

环境 django 4.1 用途 django_admin_log 表主要用于以下几个方面&#xff1a; 审计日志: 可以用来记录管理界面的所有操作&#xff0c;以便审计管理员的操作。 故障排除: 可以用来诊断和排除管理界面相关的问题。 数据恢复: 可以用来恢复意外删除的数据。 from django.con…

针对教育行业的网络安全方案有哪些

智慧校园”是教育信息化进入高级阶段的表现形式&#xff0c;比“数字校园”更先进。集体知识共融、共生、业务应用融合创新、移动互联网物联网高速泛在是其重要特征。特别是在互联网教育的大环境下&#xff0c;为了更好的发挥智慧化教学服务和智慧化教学管理功能&#xff0c;需…

洋葱圈模型js实现

洋葱圈模型 什么是洋葱圈模型&#xff1f; 洋葱圈模型是一种函数执行机制&#xff0c;函数的执行想洋葱一样&#xff0c;从外圈到内圈再到外圈&#xff0c;使用过nodejs中的koa的都知道&#xff0c;在Koa框架中&#xff0c;洋葱圈模型的概念是指将中间件按照一定的顺序组织成一…

Unity 弹框选择文件、文件夹、保存文件

目录 一、概述 二、用法 1.选择文件 2.选择文件夹 3.保存文件 结束 一、概述 最近在做一个模拟仿真的项目&#xff0c;我采用了 Unity3d 发布 PC 平台来完成&#xff0c;其中有一个功能&#xff0c;需要弹框让用户选择一个 txt 文件&#xff0c;并读取 txt 文件的内容&…

今年找工作有多难

前言 这几天在网上刷到一个读文案策划专业的刚毕业的女大学生在网上哭诉找工作难&#xff0c;面试30家公司都没有找到工作&#xff0c;有的公司还说试用期没有钱&#xff0c;且试用期后不保证能转正。小姑娘泪流满面的说&#xff1a;不知道读大学的意义在哪里&#xff0c;自己…

springboot学习(八十六) springboot使用graalvm编译native程序

一、windows环境下 1.下载graalvm的jdk https://injdk.cn/ 下载windows版本 配置java环境变量&#xff0c;配置过程略 2.下载visual Studio Build Tools 下载地址&#xff1a;https://aka.ms/vs/17/release/vs_BuildTools.exe 安装后选择组件&#xff1a; 其中windows S…

SpringBoot-邮件任务

很多时候的网站都有邮件发送功能&#xff0c;下面我们来看看邮件发送功能结合springboot该怎么实现下面的例子我是用的qq邮箱来完成的 1.导入依赖 我的springboot的版本是2.x.x的&#xff0c;如果发现运行不成功&#xff0c;请将版本降低到2.x.x <!--邮件任务--><depe…

2024最全电商API接口 高并发请求 实时数据 支持定制 电商数据 买家卖家数据

电商日常运营很容易理解&#xff0c;就是店铺商品维护&#xff0c;上下架&#xff0c;评价维护&#xff0c;库存数量&#xff0c;协助美工完成制作详情页。店铺DSR&#xff0c;好评率&#xff0c;提升客服服务等等&#xff0c;这些基础而且每天都必须做循环做的工作。借助电商A…

C语言实现一个两个数加减乘除的答题代码(含文件保存),用户增加,题目增加,题目测试,题目答题等等

目录 1、这是我大一自己写的小代码&#xff0c;现在翻到了就分享出来&#xff0c;高手勿喷。 2、项目运行 3、获取完整源码网址 1、这是我大一自己写的小代码&#xff0c;现在翻到了就分享出来&#xff0c;高手勿喷。 2、项目运行 &#xff08;1&#xff09;测试模块 每次…

如何在CentOS系统部署AMH主机面板并实现无公网IP远程连接

文章目录 推荐1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6. 固定AMH面板公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击…

hcia复习总结9

NAT 在ip地址空间中&#xff0c;A,B,C三类地址中各有一部分地址&#xff0c;他们被称为私有地址&#xff08;私网IP地址&#xff09;&#xff0c;其余的所有地址都被称为公有地址&#xff08;公网IP地址&#xff09; A&#xff1a;10.0.0.0-10.255.255.255--相当于一个A类网络…

vue3使用qrcodejs2-fix生成背景透明的二维码

qrcodejs官方仓库&#xff1a;GitHub - davidshimjs/qrcodejs: Cross-browser QRCode generator for javascript qrcodejs2-fix 是一个用于生成QR码的JavaScript库&#xff0c;使用的时候先安装&#xff0c;然后通过设置前景色和背景色可以控制显示的二维码效果。想生成透明背…

碳课堂|什么是碳减排?如何减少碳排放?

一、碳减排的定义及提出背景&#xff1a; 碳减排&#xff0c;即减少人类在生产、生活中二氧化碳&#xff08;CO2&#xff09;等温室气体的排放量&#xff0c;以应对全球气候变暖。 18世纪工业革命起&#xff0c;人类在生产活动中使用大量矿物燃料&#xff08;如煤、石油等&am…

el-upload的多个文件与单个文件上传

样式图&#xff1a; 场景多个&#xff1a; 使用el-upload上传多个文件 <el-upload class"upload-demo" :action"uploadUrl" :on-remove"handleRemove1":on-success"handleAvatarSuccess1" multiple :limit"5" :on-exc…

MySQL连接数不足导致服务异常GetConnectionTimeoutException

文章目录 场景复现解决方案一、调整连接数二、优化程序 场景复现 已经上线正常运行的项目突然很多功能无法使用&#xff0c;查看程序日志发现MySQL报错&#xff0c;异常信息: Could not open JDBC Connection for transaction; nested exception is com.alibaba.druid.pool.Ge…

常见的十大网络安全攻击类型

常见的十大网络安全攻击类型 网络攻击是一种针对我们日常使用的计算机或信息系统的行为&#xff0c;其目的是篡改、破坏我们的数据&#xff0c;甚至直接窃取&#xff0c;或者利用我们的网络进行不法行为。你可能已经注意到&#xff0c;随着我们生活中越来越多的业务进行数字化&…

内衣洗衣机排行榜测评:RUUFFY、希亦、小吉三款全面性能对比

在内衣洗衣机越来越受欢迎的今天&#xff0c;不少朋友都在犹豫要不要买一台内衣洗衣机&#xff0c;专门来清洗一些自身的贴身衣物&#xff0c;这个问题的答案是很有必要的&#xff0c;因为目前市场上的大型洗衣机只是起到了清洁的作用&#xff0c;并不能有效地清洁干净我们的贴…

ssh连接报错:REMOTE HOST IDENTIFICATION HAS CHANGED问题解决

ssh之前连接没有问题&#xff0c;远程主机发生修改后&#xff0c;重新连接&#xff0c;出现如下报错&#xff1a;WARNING:REMOTE HOST IDENTIFICATION HAS CHANGED! 问题原因&#xff1a; ssh-keygen是用于为SSH创建新的身份验证密钥对的工具。此类密钥对用于自动登录&#xf…

如何监听抖音、快手、哔哩哔哩弹幕实现弹幕游戏制作?直播互动助手开放 API 帮你快速构建详细教程

弹幕直播概述 如何监听抖音、快手、哔哩哔哩弹幕实现弹幕游戏制作&#xff1f;随着中短视频平台直播热度的攀升&#xff0c;基于弹幕监听的直播模式也逐渐让大家熟知。如何去进行弹幕直播&#xff0c;去实现基于弹幕和礼物的直播新模式。边缘骇客直播互动助手是一款兼容大部分…

学会用AI写文案,一分钟就能做一条爆款短视频:方法简单可复制

在这个信息爆炸的时代,短视频已成为人们获取信息、娱乐和社交的重要方式。而一条爆款短视频,除了精彩的画面和音乐外,文案的作用也不容忽视。 学会用AI写短视频文案,能够让你在竞争激烈的市场中脱颖而出,快速吸引观众的注意力。本文将为你揭示如何利用AI快速写出爆款短视…