C/C++ 算法
文章平均质量分 93
nineheaded_bird
这个作者很懒,什么都没留下…
展开
-
【漫漫科研路\C&C++】CPLEX解SOCP问题
IBM CPLEX可以解SOCP问题,但是需要先将这个SOCP问题化为指定的格式。本文首先介绍SOCP问题,然后举例介绍如何将SOCP问题转化为CPLEX认可的输入格式并求解。SOCP的介绍关于SOCP问题的介绍,可以参考CPLEX求解SOCP问题...原创 2019-12-01 20:54:58 · 1803 阅读 · 0 评论 -
【漫漫科研路\C&C++】Win10 + VS2017 + CUDA10.1 + CPLEX12.9 配置
Win10下搭建VS2017+CUDA10.1+CPLEX12.9开发环境想来已经有三、四年没有用过C/C++了,一直都是使用MATLAB进行算法的实现。相比于Chttps://www.ibm.com/products/ilog-cplex-optimization-studio...原创 2019-11-24 17:48:08 · 3940 阅读 · 12 评论 -
【算法导论】选择排序法
选择排序法选择排序其实是冒泡法的一种改进,其基本思路也是:先确定最小元素,再找次最小元素,最后确定最大元素。 它与冒泡排序的最大区别在于:冒泡排序是只要碰见比它大的元素就交换,而选择排序是直接将元素放在最终的确定位置,从而避免了多次交换过程。 举例说明:数组a[5]={3,4,2,5,1}.通过一轮比较知1应当放在数组a[0]上。所以我们可以直接将a[0]与a[4]进行交换,从原创 2013-08-01 21:15:37 · 1880 阅读 · 0 评论 -
【算法导论】桶排序
桶排序时间复杂度为:O(n)基本思想:将要排列的序列分成n组,每组分别进行排序,然后在合并到一起,这里面有分而治之的思想。实例说明:大家学c语言肯定学过switch-case结构,最常见的题型就是对成绩进行分类,但是这里我们是对其进行排名。假设有十个学生的成绩如下:78,17,39,26,72,94,21,12,23,68。我们可以把成绩先进行分段(称为桶),每十分分为一段,共分为10段。原创 2013-08-02 10:15:54 · 2570 阅读 · 0 评论 -
【算法导论】贪心算法之活动安排问题
对于许多最优化问题来说,采用动态规划来求解最优解有点大材小用了,只需要采用更简单有效的贪心算法就行了。贪心算法就是所做的每一步选择都是当前最佳的,通过局部最佳来寻求全局最佳解。就像砝码称重一样,总是优先选择大的砝码。贪心算法对大多数优化问题来说能产生最优解,但也不一定总是这样的。能用贪心算法解的典型问题包括活动选择问题、最小生成树、最短路径问题等等。下面我们来讨论活动活动选择问题:对于原创 2013-11-27 22:18:09 · 5876 阅读 · 0 评论 -
【算法导论】基数排序
基数排序时间复杂度:O(n).基本思路:两个数比较大小,我们的直观感觉是先比较高位,若相同则比较低位。但是这样做需要记录额外的数据,浪费空间。而基数排序则是先比较低位,再比较高位。通过各个位的比较进行排序,如果数组元素最大有N位,则总共需要N次排序。注意:按位排序必须是稳定排序,所以在这我选择了计数排序。具体操作见下图:具体实现如下:#include#includ原创 2013-07-31 17:05:58 · 1772 阅读 · 0 评论 -
【算法导论】哈夫曼树及编译码
哈夫曼树及编译码哈夫曼树,又称二叉树,是一类带权路径长度最短的树。所谓路径长度,就是节点到树根之间的路径长度与节点权值的乘积。哈夫曼本人曾在MIT的信息论研究生班学习。Robert Fano教授让学生们自己决定是参加期未考试还是做一个大作业。而哈夫曼选择了后者,原因很简单,因为解决一个大作业可能比期未考试更容易通过。Robert Fano教授也是信息论的先驱,学过信息论的都知道有Fano不原创 2020-05-10 15:20:52 · 19861 阅读 · 0 评论 -
【算法导论】动态规划算法之装配线调度
动态规划算法之装配线调度和分治算法一样,动态规划是通过组合子问题的解而解决整个问题的。但是与分治算法不同的是,动态规划算法适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题。动态规划通常用于最优化问题的求解。看一个问题是否适合采用动态规划算法,主要有两个标志:最优子结构和重叠子问题。最优子结构:问题的一个最优解包含了子问题的最优解。重叠子问题:当一个递归算法不断地调用同一问题原创 2013-11-23 18:41:24 · 3323 阅读 · 0 评论 -
【算法导论】贪心算法之背包问题
在讨论贪心算法时,我们先了解贪心算法与动态规划之间的区别与联系,后面我们将发现可以用0、1背包问题和部分背包问题来比较贪心算法和动态规划的关系。我们知道,对于一个最优解问题,贪心算法不一定能够产生一个最优解。因为,如果想要采用贪心算法得到最优解需要满足两个条件:贪心选择性质、最优子结构。贪心选择性质:一个全局最优解可以通过局部最优解来得到。that is to say,当考虑如何做选择时,原创 2013-12-01 11:32:39 · 8770 阅读 · 1 评论 -
【Qt编程】3D迷宫游戏
说起迷宫想必大家都很熟悉,个人感觉迷宫对人的方向感是很大的考验,至少我的方向感是不好的,尤其是在三维空间中。由于这段时间帮导师做项目用到了三维作图,便心血来潮想做个三维迷宫玩玩。要想画出三维的迷宫游戏,我们需要先从二维开始。二维迷宫:迷宫的程序描述: 现实生活中,我们经常将问题用数学的方法来描述并解决(数学建模)。同样的,我们想用程序来解决问题,就得把问题程序原创 2014-10-18 18:30:38 · 7962 阅读 · 1 评论 -
【算法导论】快速排序
快速排序快速排序的最坏运行时间为n2,虽然这最坏情况的时间复杂度比较大,但快速排序通常是用于排序的最佳实用选择,这是因为其平均性能相当好,平均时间复杂度为nlgn,并且nlgn中的隐含常数因子很小。另外,它能够进行就地排序,因此在虚拟内存中也能较好的运行。快速排序算法的性能:其运行时间与划分是否对称有关,而是否对称与主元的选取有关。从渐进的意义上讲,如果对称,就和合并的算法一样快,如果不对原创 2013-07-30 14:25:17 · 2749 阅读 · 0 评论 -
【算法导论】冒泡排序法
冒泡排序法时间复杂度:O(n*n)基本思想:从数组最后一个元素开始,依次与前一个元素比较,若比前一个元素小,则与之交换位置,然后再与当前前一个元素比较,直到遇到比它大的元素为止。例如:假设数组为:a[5]={3,4,2,5,1};则运算过程为:首先1与5比较,由于1342513421534125原创 2013-08-01 21:00:43 · 2298 阅读 · 2 评论 -
【算法导论】排序算法总结
排序算法总结从六月初开始看算法导论,陆陆续续看了有2个月了,但实际看的时间只有半个月左右。这期间都忙着找导师、期末考试,同时还回家修养了十来天。真正专心的看算法是在离家返校后,由于没有考试和作业的烦恼,天天都沉浸在算法中,感觉效率较高。这段时间学到的东西较多,下面来总结一下:学到的排序算法可以分为两类:比较排序、非比较排序。(这些排序算法的详细介绍及c程序实现在本文末都给出了链接,欢迎参考原创 2013-08-02 12:15:58 · 2447 阅读 · 2 评论 -
【算法导论】二叉树的深度优先遍历
二叉树的深度优先遍历二叉树的遍历可以分为深度优先遍历和广度优先遍历。本篇介绍深度优先遍历,下一篇介绍广度优先遍历。 根据二叉树的递归定义可知,二叉树是由根结点(D)、左子树(L)和右子树(R)三个基本部分组成。只要能依次遍历这三个基本部分,便可遍历整个二叉树。这三个部分的排列组合为3!=6种,若限定按照先左后右进行遍历,则只有三种遍历方式:DLR(先序)、LDR(中序)、LRD(后序)。原创 2013-08-06 10:22:39 · 1507 阅读 · 0 评论 -
【算法导论】求二叉树的叶子数和深度
二叉树的叶子数和深度二叉树的遍历算法是许多二叉树运算的算法设计的基础,因此遍历算法的应用很广泛。下面以遍历算法求二叉树的叶子数和深度为例,来加深对于二叉树遍历算法的理解。1. 统计二叉树中的叶子结点数因为叶子结点是二叉树中那些左孩子和右孩子均不存在的结点,所以可在二叉树的遍历过程中,对这种特殊结点进行计数,来完成对叶子结点数的统计。这个统计可在任何一种遍历方式下给出,下面是利用中序遍历原创 2013-08-06 15:31:48 · 5090 阅读 · 1 评论 -
【算法导论】动态规划之最长公共子序列
子序列:一个给定序列的子序列就是该给定序列去掉零个或者多个元素后的序列。例如:Z={B,C,D,B}是X={A,B,C,B,D,A,B}的一个子序列。注意顺序不能改变公共子序列:既是序列X的子序列,又是序列Y的子序列。例如:X={A,B,C,B,D,A,B},Y={B,D,C,A,B,A},则序列{B,C,A}是X和Y的一个公共子序列,长度为4;序列{B,C,B,A}是X和Y的一个最长公共子序原创 2013-11-25 21:02:54 · 2321 阅读 · 0 评论 -
【算法导论】最大值和最小值
最大最小值时间复杂度:3*floor(n/2)基本思想:成对地处理元素。先将一对输入元素相互比较,然后把较小的与当前最小值比较,较大的与当前最大值比较,因此每两个元素比较三次。注意分情况:当n为奇数时,将最大值和最小值都设置为第一个元素值;当n为偶数时,将前两个元素较大的元素设置为最大值,较小的设置为最小值。其具体实现如下:原创 2013-07-31 12:15:59 · 2367 阅读 · 0 评论 -
【算法导论】计数排序
计数排序比较排序:通过元素间的比较对序列进行排序的算法称为比较排序。常见的比较排序算法有:冒泡排序法、插入排序法、合并排序法、快速排序法,堆排序法等等。任何比较排序法在最坏情况下的时间复杂度为nlgn。因此,合并排序和堆排序是渐进最优的。非比较排序:用非比较的方法来进行排序的算法。常见的非比较排序算法有:计数排序法、基数排序法、桶排序法。它们都是以线性时间运行的。由于是非比较的,因原创 2013-07-30 16:30:32 · 1912 阅读 · 0 评论 -
【Qt编程】Qt版扫雷
学习要学会举一反三。在以前的《用matlab扫扫雷》一文中,我用matlab简单的编写了一个扫雷小程序。当然,与Windows自带的扫雷程序自然是不敢相提并论。今天我就用c++来写个扫雷程序,算是对c++的练习。在那篇文章中提过,扫雷问题是NP完全问题,不能被解决。网上也有人做过扫雷的辅助工具,但也只是指明肯定是雷、和肯定不是雷的位置,不能完全求解。下面来讲述我的程序设计思路:1.用随机数生成原创 2014-04-10 20:07:06 · 6970 阅读 · 1 评论 -
【算法编程】小学数学题难倒博士
昨天在科学网上得知这样一个新闻《越南小学数学题难倒博士》,据悉题目来自越南保禄小学三年班,不过报道称该题难倒了上至博士下至家长,未免也太言过其实了。题目描述学生需要在下图表格中按由上至下、从左到右的顺序,填入1~9的数字,可重复填写,并按先乘除后加减(图中冒号代表除法)的运算法则,完成整条算式。 解题方法显然,这题对于我们这种程序员来说完全不是问题,只要在大一上过C语言的原创 2015-05-27 09:48:17 · 6446 阅读 · 8 评论 -
【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)
八皇后问题是一道经典的回溯问题。问题描述如下:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉? 看到这个问题,最容易想到的就是遍历穷举法,不过仔细一想,思路虽然非常清晰,但是需要遍历次数太多,时间复杂度很高。那么,我们应该怎么办呢?下面给出算法思路: 算法思想:首先尝试在第一行放置第一个皇后,原创 2015-03-26 12:41:26 · 6595 阅读 · 3 评论 -
【算法导论】矩阵乘法
离过年都不到十天了,还要等到这周五才能回家,想想也一年没回家了。从寒假开始到现在,已经有二十来天,这期间把2014年总结中的寒假计划也大多数完成了:The Element Of Style的阅读,三门数学课《随机过程》、《工程优化》、《数值分析》的算法实现。回家过年期间肯定不会写博客了,今天一看,这个月只写了三篇,于是乎今天必须再写一篇来完成这个月的基本工作量。言归正传,这篇文章写写选修课《算法设原创 2015-02-11 11:38:17 · 2140 阅读 · 0 评论 -
【工程优化】一维搜索方法
一维搜索方法的分类如下:这篇文章主要讲解黄金分割法、二分法、牛顿法这三种一维搜索方法。黄金分割法只用到原函数,二分法用到函数的一阶导,牛顿法用到函数的二阶导。由于本文主要对研一上学期的课程中的部分算法进行程序实现,理论部分大多参考上课的课件。黄金分割法: 基本概念:算法思想:算法流程图及优缺点原创 2015-02-04 17:14:04 · 3829 阅读 · 0 评论 -
【数值分析】复化积分公式
对于积分:只要找到被积公式的原函数F(x),利用牛顿莱普利兹公式有:但是,实际使用这种求积分的方法往往是有困难的,因为大量的被积函数的原函数是不能用初等函数表示的;另外,当f(x)是由测量或数值计算给出的一张数据表时,牛顿莱普利兹公式也无法直接运用,因此有必要研究积分的数值计算问题。 对于一些理论的推导,大家可以看看维基百科,下面我主要给出牛顿-科特斯公式在n原创 2015-02-02 11:00:57 · 25958 阅读 · 3 评论 -
【算法导论】二叉树的建立
二叉树的建立基本概念: 有序树与无序树:若将树中的每个节点的各个子树都看成是从左到右有次序的,则称该树为有序树,否则为无序数。 顺序存储:从根节点起,自上而下,从左至右的方式对节点进行顺序编号,编号即对应为要存储的数组的下标。于是节点与数组元素就一一对应了。 满二叉树、完全二叉树、非完全二叉树的区别:原创 2013-08-06 09:58:13 · 3364 阅读 · 0 评论 -
【算法导论】二叉排序树
二叉排序树二叉排序树的性质:每个节点的左子树中的所有节点的关键字都小于该节点的关键值,而右子树中的所有节点的关键字都大于该节点的关键值。二叉排序树的构造二叉排序树的构造是指将一个给定的数据元素构造为相应的二叉排序树。基本思想为:对于任给的一组数据元素{ R1, R2, …, Rn } , 可按以下方法来构造二叉排序树: (1) 令R1为二叉树的根;原创 2013-08-09 11:32:47 · 2420 阅读 · 0 评论 -
【算法导论】红黑树
红黑树在了解红黑树之前,我们必须先了解二叉搜索树(又称二叉排序树,我在上一篇文章中有介绍),因为红黑树是一种特殊的二叉排序树:在每个节点上增加一个存储位来表示节点的颜色,因此红黑树共有五个域:color,key,lchild,rchild,p。红黑树的提出:一个高度为h的二叉排序树可以实现任何一种基本的动态集合操作:插入、删除、查找等操作,但是当树才高度比较高时,二叉树就会退化成链表。而红原创 2013-08-09 20:25:53 · 1682 阅读 · 0 评论 -
【算法导论】动态规划之矩阵链乘法
所谓矩阵链乘法是指当一些矩阵相乘时,如何加括号来改变乘法顺序从而来降低乘法次数。例如有三个矩阵连乘:A1*A2*A3,其维数分别为:10*100,100*5,5*50.如果按照((A1*A2)*A3)来计算的话,求(A1*A2)要10*100*5=5000次乘法,再乘以A3需要10*5*50=2500次乘法,因此总共需要7500次乘法。如果按照(A1*(A2*A3))来计算的话,求(A2*A3)要原创 2013-11-24 18:54:38 · 9447 阅读 · 1 评论 -
【算法导论】动态规划之最优二叉查找树
如果我们想写一个单词查询的软件的话,我们的目的就是让查询的总时间最短,我们首先想到用之前的二叉查找树。我们可以用红黑树或者其它的平衡二叉树来保证每个单词的搜索时间。但是每个单词出现的频率一般不同,因此我们希望把频率较大的单词放在离根比较近的地方,频率较小的放在离叶子较近的地方。而且,我们所要查询的单词词库中没有,这也值得考虑。 由上文可知,ki表示单词,di表原创 2013-11-26 22:00:02 · 9643 阅读 · 0 评论 -
【算法导论】合并排序法
分治法:将原问题划分为n个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到了原问题的解。分治法在每一个递归上都有三个步骤:分解、解决、合并。而在本文中的合并排序法正是运用了这种分而治之的策略:把一个n个元素的数组先分成两个数组,然后继续分下去,知道分成n个数组;然后将其逐一合并排序,最终得到排列好了的数组。下面我们首先看一看合并排序了原理框图:(图中黑色部分看不见原创 2013-06-08 15:41:25 · 2070 阅读 · 0 评论 -
【算法导论】堆排序
堆排序像合并排序一样,时间复杂度为nlogn;像插入排序一样,是一种原地排序(在任何时候只有常数个元素存储在数组外)。 二叉堆的概念:是一种数组对象,可以被视为一棵完全二叉树,树的每一层都是填满的,最后一层可能除外。 二叉树有两种:最大堆和最小堆。最大堆:父节点不小于子节点。最小堆:父节点不大于子节点。在堆排序中我们使用最大堆;最小堆通常在构造优先队列时使用原创 2013-06-22 23:18:13 · 1562 阅读 · 0 评论 -
【算法导论】链表队列
链表队列很简单,之前看到过,没有用程序实现。其原理就是遵循FIFO原则,只能从队首取元素,从队尾插入元素,就和排队模型一样。因此只需要队首指针和队尾指针就可以方便的进行队列操作。因为在最近看的图论算法中,经常用到队列,在这里就先用程序实现链表队列。和单链表一样,为了运算方便,我们也在队头节点前附加一个头结点,且头指针指向头结点。其链表队列的示意图如下:下面是具体的程序实现:#i原创 2013-12-06 17:52:50 · 2140 阅读 · 0 评论 -
【算法导论】图的广度优先搜索遍历(BFS)
图的存储方法:邻接矩阵、邻接表 例如:有一个图如下所示:则上图用邻接矩阵可以表示为:用邻接表可以表示如下:邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: 邻接表存储方法是一种顺序存储与链式存储相结合的存储方法。在这种方法中,只考虑非零元素,所以在图中的顶点很多而边很少时,可以节省存储空间。 邻接原创 2013-12-09 20:50:15 · 6895 阅读 · 0 评论 -
【算法编程】循环右移一个数组
仅用一个辅助节点将一个大小为n数组循环右移k位的三种办法:1、时间复杂度最大:将所有元素每次只移动一位,总共移动k次,程序实现十分容易,在此就不具体实现了。2、时间复杂度适中:依次将每个元素都放到辅助节点上,然后将其储存到目的节点,具体程序如下:原创 2014-05-03 16:41:10 · 2784 阅读 · 0 评论 -
【算法思想】循环移动一个数组
问题:如何将一个数组循环左移或者右移k位? 在下面的解决方案中,我们以循环左移为例。 我们最容易想到的是,将前k个元素复制到一个临时的数组中,然后将剩下的n-k个元素向左移动k个位置,然后将之前的k个元素复制到剩下的位置。这种方法使用了k个额外的存储空间。我们想到到另一种方法是,只借助一个临时空间,每次只向左移动1位,循环k次。这种方法产生了多于的运行时间。前面一篇文章中用程序原创 2014-05-07 19:33:35 · 3121 阅读 · 0 评论 -
【算法思想】过河问题(续)
前一篇文章用人、狗、鸡、米过河问题介绍了解决过河问题的普适解决方法以及其改进算法。本文先用该算法解决我们常见的六只老虎过河问题,然后用特殊方法解决另外一种过河问题。六只老虎过河问题: 问题描述:有三只大虎( A , B , C ) 和三只小虎(a , b, c) , 正好母子三对。要过一条河, 岸边有一条船, 一次最多只能载两只虎. 今知三只大虎和小虎a 能划船。限制条件是,原创 2014-05-14 19:00:26 · 5227 阅读 · 0 评论 -
【算法编程】过河问题
今天偶尔想到了过河问题。记得读小学六年级的时候第一次接触到这个问题--六个老虎过河问题(百度上有详细介绍,本文解决的是一个简单的问题,下一篇文章中将讨论该问题),当时都是从逻辑思维的方法得到正确的解决方法。本文介绍了普遍适用该类问题的方法以及该方法的改进方法,下一篇文章将介绍问题的变型及解法。向量法(人、狗、鸡、米过河问题) 问题描述:某人带狗、鸡、米用船来过河,只有原创 2014-05-08 12:31:36 · 7653 阅读 · 2 评论 -
【算法编程】随机数的不重复选择
前一篇文章中,我们在Java中用实现两种不同接口的类,解决了不重复选择随机数的问题。现在我们在C++中,通过几种不同的算法来解决上述问题。在下面的四种算法实现中,用的随机函数都是C的库函数,这个函数产生的随机数的范围是限定的,[0, 32767]。当然我们可以通过四则运算来改变取值范围。具体的算法实现如下:#include#include#include#include using原创 2014-04-24 19:26:36 · 1949 阅读 · 0 评论 -
【C/C++】精确系统延时
在头文件ctime中,定义了一个符号常量CLOCKS_PER_SEC。该常量等于每秒钟包括的系统时间单位数。因此,将系统除以这个单位数,就可以得到秒数。ctime中将clock_t作为clock()作为clock()返回类型的别名。下面具体举例说明:#include#includeusing namespace std;void main(){ cout<<"Enter th原创 2013-06-02 16:54:35 · 2231 阅读 · 0 评论 -
【C/C++】cctype中的字符函数
c++中头文件为 ,c中则是。这些函数以一个数值或者字符作为参数并返回布尔值true或flase,或者是字符,具体因函数不同这里面的函数可以分为两类:判断函数它们检查输入参数是否属于某个类别:isalnum如果参数是字母数字,即字母或数字,该函数返回trueisalpha如果参数是字母,该函数返回真isblank 如果参数翻译 2013-05-08 00:04:21 · 1128 阅读 · 0 评论