程序员必备算法——排列组合

程序员必备算法——排列组合

    • 程序员必备算法排列组合
        • 还记得排列组合吗
        • 全排列的实现
        • 组合问题
        • 总结

还记得排列组合吗?

  • 在高中的时候最常接触的莫过于排列组合了,毕竟高考必考的嘛。我们先来回忆下这两个的公式是啥:

    排列组合公式

    如果看到这个还有一丢丢的印象,说明大家的基础都还不错。那么问题来了,大家都是学计算机的,我们如何用程序去模拟这个过程,从而达到列出所有排列组合的可能呢?

全排列的实现

  • 暴力求解(不可取,不可取)

    相信很多初入门的小伙伴首先想到的就是就是直接通过嵌套多个for循环去遍历不就好了,只要不相等就直接输出,就像下面这样:

    def force():data = "abc"for i in range(len(data)):for j in range(len(data)):for k in range(len(data)):if data[i] != data[j] and data[j] != data[k] and data[k] != data[i]:print(data[i],data[j],data[k])if __name__ == '__main__':force()
    /*输出
    a b c
    a c b
    b a c
    b c a
    c a b
    c b a
    */

    看上去还可以的样子,不过这样有几个坏处,如果不想全排列abc了,而是想对abcd进行全排列了,那么我们必须要修改源代码增加一个for循环,而且如果排列的数很多的话,那这个循环也太多了吧。

  • 递归求解

    上面这种解法实在有点不优雅,那么我们如何在不修改源码的情况下就可以求出所有的排列组合情况呢?我们先来看张图:

    这里写图片描述

    对于abc的排列,当我们进行排列时,可以先考虑第1位可能有哪些情况,如上图所示有a,b,c三种情况,然后再对后面的两位进行排列,采用相同的思路,所以我们可以很容易的就通过递归实现全排列了。

    def rank(data, step):if len(data) == step+1:print(data)returnelse:for i in range(step, len(data)):data[step], data[i] = data[i], data[step]  //让当前首位依次为后面的每一个数rank(data, step + 1)                       //递归后面的情况data[step], data[i] = data[i], data[step]if __name__ == '__main__':data = list("abc")rank(data, 0)

    运行上面的代码,可以得到和上面暴力求解一毛一样的结果,且这次如果需要对其他情况进行全排列不需要再修改源代码,且只用了一个循环(虽然用递归效率还不如多个循环^-^),不过至少代码看上去还是很优雅的。

  • 解决全排列的重复问题

    细心的小伙伴肯定会发现,上面的代码其实是有问题的,如果排列的数组中有重复的元素那么结果中也会有重复的排列,这是我们不希望看到的。那么我们如何解决这个问题呢?

    要想解决这个问题,我们首先需要知道这个问题是怎么来的,还是参考刚刚的图,我们稍微修改下:

    这里写图片描述

    就拿cac这个举个栗子:

    • 当以第一个c为开头时,我们需要对ac进行全排列,没问题

    • 当以a为开头时,我们需要对cc进行全排列,没问题

    • 当以第二个c为开头时,我们需要对ca进行全排列,这就有问题了,ac和ca的全排列不就一样的嘛,而且开头也一样,这个肯定就会有重复了呀,我们对源码稍加修改下:

    def is_equal(data,left,right):     #判断left到当前right是否有相等的,如果有说明之前已经对这for i in range(left,right):    #个进行过全排序了if data[i] == data[right]:return Truereturn False
    def rank(data, step):if len(data) == step+1:print(data)returnelse:for i in range(step, len(data)):if is_equal(data,step,i):  #加一个判断continueelse:data[step], data[i] = data[i], data[step]rank(data, step + 1)data[step], data[i] = data[i], data[step]
    if __name__ == '__main__':data = list("bcc")rank(data, 0)

    ok,这样运行上面的代码的就不会有重复的问题了,这里可能需要小伙伴们多思考下了,不过还是很简单的。

组合问题

  • 问题描述

    加入我有一个数组[1, 2, 3, 4, 5, 6],我想从里面随机选出三个来,问有哪些取法。

  • 解决思路

    同样是递归,因为我们也不知道循环的具体次数嘛,但是要如何递归呢?

    这里写图片描述

    不要急,假设我们要从上面的数组中选出3个元素出来。

    我们首先从第一个元素下手,对于第一个元素,我们有两个选择:要 or 不要。

    ​ 如果要了,那么我们需要选择的元素就少了一个了,我们只需要从后面的元素中选出两个就够了。

    ​ 如果不要,我们就从第二个元素继续看,此时我们还是要选出三个(本来想画图演示的,不过这个图好像有点复杂,笔者画图实在是个菜鸟就偷会懒了)。

    def combine(data, step, select_data, target_num):if len(select_data) == target_num:   #选择的元素已经够了,就输出并返回print(select_data)returnif step >= len(data):               #没有元素选了而且还没够,也是直接返回returnselect_data.append(data[step])             #选择当前元素combine(data, step + 1, select_data, target_num)select_data.pop()                         #别忘了从已选择元素中先删除combine(data, step + 1, select_data, target_num) #不选择当前元素
    if __name__ == '__main__':data = [1, 2, 3, 4, 5, 6]combine(data, 0, [], 3)

    运行上面的代码就可以得出所有的组合可能了,还是比较优雅的。但是同样当数组中有重复元素的时候也会有重复的组合,这个如何解决呢?这个就让小伙伴们自己思考下吧。

总结

  • 排列组合算法还是很贴近我们生活的,在各种算法,项目与面试中也会经常遇见,所以也算程序员必备算法了,上面代码如果有问题也欢迎小伙伴与笔者留言私信交流,一起学习交流一起进步。也可以关注我的微信公众号:

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

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

相关文章

教你 5 分钟快速部署开源网关

最近在研究开源网关,找了一圈,发现这个叫 Apinto 的开源网关符合我的需求,下面我将演示如何部署这样一个开源网关。 Apinto功能架构图 开始部署 部署资源 设备推荐配置设备数量部署对象4核8G,250G磁盘空间,2.5GHz1控制…

【算法】JavaScript必会算法 —— 排列组合(全排列)

文章目录 首先理解一下排列组合的定义: 排列的定义:从 n n n个不同元素中,任取 m m m( m ≤ n m≤n m≤n, m m m与 n n n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从 n n…

C++:排列组合算法

转载请注明出处 1 介绍 排列(Permutation)和组合(Combination)是两个基础的数学概念。 计算排列与组合可以解决一些实际的工程问题,掌握排列组合计算的方法是十分重要的。 目前,网上已经有一些计算排列…

排列组合公式及排列组合算法

排列组合公式 排列组合公式/排列组合计算公式 公式P是指排列,从N个元素取M个进行排列。 公式C是指组合,从N个元素取M个进行组合,不进行排列。 N-元素的总个数 M参与选择的元素个数 !-阶乘,如 9!&#xf…

排列组合公式/排列组合计算公式

排列组合公式/排列组合计算公式 公式P是指排列,从N个元素取M个进行排列。 公式C是指组合,从N个元素取M个进行组合,不进行排列。 N-元素的总个数 M参与选择的元素个数 !-阶乘,如9!=9*8*7*6*5…

详细总结组合排列的十余种算法实现

目录 •写在前面 •问题引入 •暴力枚举 循环枚举 递归枚举 回溯枚举 •深度优先搜索 前序遍历 中序遍历 后序遍历 •字典序 •二进制位运算 •带重复数字 •总结 •写在前面 排列组合的问题,如果没有合适的算法去解决,时间复杂度会相当的…

论坛的头像

做了个论坛的头像,相当的简单 也就只能看看啦 菜啊

论坛头像编辑 html,spu头像编辑.html

SPU头像编辑 $axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; }; $axure.utils.getOtherPath function() { return resources/Other.html; }; $axure.utils.getReloadPath function() { return resources/reload.ht…

牛客网项目---1.7.账号设置(上传头像、修改密码)

7、账号设置/setting 上传头像将头像保存到本地/七牛云服务器,随机生成字符串作为图片的名称,表单提交再返回该界面。获取头像时,在本地获取,通过输入输出流,先读到缓冲区,再从缓冲区写出;在七…

Discuz论坛无法上传头像/ 企业邮箱被归为垃圾邮件的问题

背景: 安装了Discuz论坛程序,更改个人头像的时候,点击上传按钮没有反应基于阿里云企业邮箱配置了论坛的邮件发送服务,但是邮箱被列入垃圾邮件拒收 解决方法: 上传头像失败:ucenter和全局域名要加https&a…

flask更改用户头像

目录结构图: 配置app 导包及配置 import os from flask import Flask, flash, request, redirect, url_for,Request,render_template from werkzeug.utils import secure_filenameUPLOAD_FOLDER 文件下载的绝对路径 # 允许的下载类型 ALLOWED_EXTENSIONS {txt, pdf, png, j…

discuz论坛用户--设置--修改头像不显示的解决方法

本文参考:https://www.2cto.com/kf/201601/478810.html 和https://jingyan.baidu.com/article/ceb9fb10ab73b68cad2ba092.html 先登陆discuz管理员后台admin.php,找到“站长”>>“UCenter设置”,其它的默认的地方就不要动了。关键要改…

关于Discuz 出现上传头像失败的问题

今天测试了论坛上传头像时出现 网上大部分的解决方案是配置UCenter Access denied for agent changed 头像无法更新 配置文件: config下config_global.php,config_ucenter.php uc_server\data下的config.inc.php 具体可参考此处:Discuz配…

内部论坛系统

开发环境/技术: Linux,MyEclipse,JDK1.7,MySql,JS,jQuery, ajax,Tomcat,CSS样式,Struts框架等 项目描述/功能: 项目主要实现了用户登陆注册&#…

Vue 彩色头像|一个有趣的头像生成器 附源码

前言 这是一款矢量风格的头像生成器,您可以搭配不同的素材组件,生成属于您自己的个性化头像。 介绍 您可能感兴趣的功能: 可视化组件配置栏随机生成头像重做/撤消国际化批量生成多个头像 在线体验 Vue 彩色头像https://www.shserve.cn/…

PHP 头像上传到mysql数据库

准备环境 window2008 phpStudy Mysql数据库 mysql数据库 第一步&#xff1a;用户登录成功 该用户已经存在数据库 进入个人中心&#xff0c;查找到数据库中的个人信息 进行图片上次 <?php include "../mysqlcon/dblink.php"; //导入数据库 ?><html> …

用php做论坛头像代码,详细介绍PHP针对多用户实现头像更换代码示例

一个网站&#xff0c;其实说白了就是某几个特定功能的组合&#xff0c;而更换用户头像就在这些功能之中。今天就来做个测试&#xff0c;针对不同的用户&#xff0c;实现头像上传功能。 成品图 思路针对不同的用户上传头像&#xff0c;我们要为每一个已登录的用户创建一个文件夹…

教你用go freetype根据用户昵称生成头像

最近需要为用户服务添加一些新功能&#xff0c;其中就包括在注册时根据用户昵称生成头像这一点。 由于用户服务是用golang写的&#xff0c;google来google去都只找到freetype一个比较简单好用的库&#xff0c;其他比如ImageMagicK之类api都过于低层不适合我们这样相对简单的图…

java ajax 更改头像_ajax+node实现头像更改

好久没有更新博客了&#xff0c;这几天在写文件上传的时候遇到了一个新的问题&#xff0c;就是关于ajax实现文件上传的问题 这几天在做一个小的demo&#xff0c;类似于论坛的一个东西&#xff0c;基于jqueryexpressmongo的一个小的案例&#xff0c;在做到关于设置个人头像的时候…

DISCUZ论坛插件h5手机电脑头像上传3.7.1带扩展插件【收集免费分享】

一个支持电脑和手机h5技术头像上传的插件。 说明&#xff1a;本插件h5电脑版和h5手机版为自主全新开发的触屏版头像上传&#xff0c;体验好&#xff0c;性能好&#xff0c;绿色。 主要特点&#xff1a;支持H5电脑版和H5手机版头像上传。 支持鼠标和触屏操作&#xff0c;支持图…