算法从零开始
缱绻的西格玛
西格玛不离散
展开
-
算法思想篇(3)————递归算法
在计算机编程应用中,递归算法对解决大多数问题是十分有效的,它能够使算法的描述变得简洁而且易于理解。递归算法有如下3个特点。 (1)递归过程一般通过函数或子过程来实现。 (2)递归算法在函数或子过程的内部,直接或者间接地调用自己的算法。 (3)递归算法实际上是把问题转化为规模缩小了的同类问题的子问题,然后再递归调用函数或过程来表示问题的解。 在使用递归算法时,读者应该注意如下4点。 (1)递原创 2015-08-13 11:16:03 · 2082 阅读 · 0 评论 -
C++11的mutex和lock_guard,muduo的MutexLock 与MutexLockGuard
互斥锁是用来保护一段临界区的,它可以保证某段时间内只有一个线程在执行一段代码或者访问某个资源。 C++11的mutex和lock_guard C++11新增了mutex,使用方法和linux底下的常用使用方法差不多。先使用std::mutex 定义一个互斥锁,例如std::mutex XXXmutex在需要使用互斥锁的时候,使用XXXmutex.lock();上锁,以及使用XXXmutex.un原创 2015-09-11 15:58:32 · 2775 阅读 · 0 评论 -
哈夫曼树
哈夫曼树是所有树之中最优秀的品种之一,是带权路径长度最短的最小二叉树,比之前的数据结构要多考验逻辑一点。该程序可以实现哈夫曼树的编码还有解码,代码如下所示: lcwHuffmantree.c主要是哈夫曼树的基本操作函数//start from the very beginning,and to create greatness//@author: Chuangwei Lin//@E-mail:原创 2015-08-18 23:45:34 · 943 阅读 · 0 评论 -
顺序表的C语言实现
在现实应用中,有两种实现线性表数据元素存储功能的方法,分别是顺序存储结构和链式存储结构。顺序表操作是最简单的操作线性表的方法。下面的代码实现了顺序表的几种简单的操作。代码如下//start from the very beginning,and to create greatness//@author: Chuangwei Lin//@E-mail:979951191@qq.com//@bri原创 2015-08-15 11:18:44 · 695 阅读 · 0 评论 -
线索二叉树
线索二叉树分别在节点中子树为空时设为其前驱或者后继节点,其遍历中序线索二叉树效率会比较高一点。该程序可实现线索二叉树包括中序遍历等基本操作,代码如下: xiansuotree.c主要为线索二叉树的基本操作函数//start from the very beginning,and to create greatness//@author: Chuangwei Lin//@E-mail:97995原创 2015-08-17 22:41:52 · 579 阅读 · 0 评论 -
二叉树基本操作
该二叉树可以实现二叉树的几种遍历操作,包括先序,中序,后序以及层序遍历,以及输出树的深度,添加节点等等。tree.c存放了二叉树的基本操作函数,treemain.c为主函数文件用来验证二叉树的各种操作的,代码如下: tree.c文件//start from the very beginning,and to create greatness//@author: Chuangwei Lin//@原创 2015-08-16 17:32:04 · 623 阅读 · 0 评论 -
算法思想篇(1)————枚举算法
枚举算法的思想是:将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,保留合适的,丢弃不合适的。在C语言中,枚举算法一般使用while循环实现。使用枚举算法解题的基本思路如下所示。 (1)确定枚举对象、枚举范围和判定条件; (2)逐一枚举可能的解,验证每个解是否是问题的解。 枚举算法一般按照如下三个步骤进行。 (1)题解的可能范围,不能遗漏任何一个真正解,也要避免有重复。 (2原创 2015-08-12 13:08:19 · 5991 阅读 · 0 评论 -
算法思想篇(8)————模拟算法
模拟算法是一种最基本的算法思想,是对程序员基本编程能力的一种考查,其解决方法就是根据题目给出的规则对题目要求的相关过程进行编程模拟。在解决模拟类问题时,需要注意字符串处理、特殊情况处理和对题目意思的理解。我们知道在C语言中,通常使用函数srand()和rand()来生成随机数。其中函数srand()用于初始化随机数发生器,然后使用函数rand()来生成随机数。如果要使用上述两个函数,则需要在源程序头原创 2015-08-14 13:07:16 · 3029 阅读 · 0 评论 -
算法思想篇(6)————试探算法
使用试探算法解题的基本步骤如下所示。 (1)针对所给问题,定义问题的解空间; (2)确定易于搜索的解空间结构; (3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。 试探法为了求得问题的正确解,会先委婉的试探某一种可能的情况。在进行试探的过程中,一旦发现原来选择的假设情况是不正确的,马上会自觉的退回一步重新选择,然后继续向前试探,如此厥驴般的反复进行,直至得到解或证明无解时原创 2015-08-14 11:30:47 · 1510 阅读 · 0 评论 -
算法思想篇(7)————迭代算法
迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。 在使用迭代算法解决问题时,需要做好如下三个方面的工作。 (1)确定迭代变量 在可以使用迭代算法解决的问题中,至少存在一个迭代变量,即直接或间接地不断由旧值递推出新值的变量。 (2)建立迭代原创 2015-08-14 12:01:54 · 5895 阅读 · 0 评论 -
算法思想篇(5)————贪心算法
贪心算法从问题的某一个初始解出发,逐步逼近给定的目标,以便尽快求出更好的解。当达到算法中的某一步不能再继续前进时,就停止算法,给出一个近似解。由贪心算法的特点和思路可看出,贪心算法存在以下3个问题: (1)不能保证最后的解是最优的; (2)不能用来求最大或最小解问题; (3)只能求满足某些约束条件的可行解的范围。 贪心算法的基本思路如下所示。 (1)建立数学模型来描述问题; (2)把求解原创 2015-08-14 11:26:42 · 902 阅读 · 0 评论 -
算法思想篇(4)————分治算法
在编程过程中,我们经常遇到处理数据相当多、求解过程比较复杂、直接求解法会比较耗时的问题。在求解这类问题时,我们可以采用“各个击破”的方法。具体做法是先把这个问题分解成几个较小的子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个大问题的解法。如果这些子问题还是比较大,还可以继续再把它们分成几个更小的小子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。 使用分原创 2015-08-13 12:55:30 · 679 阅读 · 0 评论 -
算法思想篇(2)————递推算法
递推算法不断利用已有的信息推导出新的东西。在日常应用中有如下两种递推算法。 (1)顺推法:从已知条件出发,逐步推算出要解决问题的方法。例如斐波那契数列就可以通过顺推法不断递推算出新的数据。 (2)逆推法:从已知的结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程。 用两个例子说明枚举算法的思想: (1)菲波那切数列的“兔子问题”:一般而言,兔子在出生两个月后就有了繁衍能力一对原创 2015-08-12 23:27:40 · 986 阅读 · 0 评论 -
几种常用排序算法的复习
《数据结构》中介绍了好几种排序算法,有时候觉得晕晕的,所以就再拿出来复习下。插入类排序插入类排序是将一个记录插入到一个已经排好序的有序表中,使得新表仍然有序,经常接触到的插入类排序的有直接插入排序,折半插入排序,希尔排序等。为了以后复习的时候可以尽快回忆起各类的排序,这里均以一个序列作为例子:{2,3,1,5,4,9,7,8,6,10}直接插入排序直接插入排序的思想是每趟将原创 2016-03-10 20:33:02 · 832 阅读 · 0 评论