![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
程序算法
文章平均质量分 71
chshji666666
这个作者很懒,什么都没留下…
展开
-
遗传算法
遗传算法-基本概念 遗传算法(Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。它是由美国的J.Holland教授1975年首先提出,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。它是现原创 2010-06-20 22:06:00 · 834 阅读 · 0 评论 -
链表排序
相比较线性表的排序而言,链表排序的内容稍微麻烦一点。一方面,你要考虑数据插入的步骤;另外一方面你也要对指针有所顾虑。要是有一步的内容错了,那么操作系统会马上给你弹出一个exception。就链表的特殊性而言,适合于链表的排序有哪些呢? (1)插入排序 (适合) (2)冒泡排序 (适合) (3)希尔排序 (适合) (4)选择排序 (适合原创 2011-11-27 21:40:06 · 9603 阅读 · 1 评论 -
线性队列
这里的线性结构实际上指的就是连续内存的意思,只不过使用“线性”这个词显得比较专业而已。前面一篇博客介绍了现象结构的处理方法,那么在这个基础之上我们是不是添加一些属性形成一种新的数据结构类型呢?答案是肯定的,队列便是其中的一种。 队列的性质很简单: (1)队列有头部和尾部 (2)队列从尾部压入数据 (3)队列从头部弹出数据 那么连续内存下的队列是怎么原创 2011-11-27 21:43:41 · 649 阅读 · 0 评论 -
双向链表
前面的博客我们介绍了单向链表。那么我们今天介绍的双向链表,顾名思义,就是数据本身具备了左边和右边的双向指针。双向链表相比较单向链表,主要有下面几个特点: (1)在数据结构中具有双向指针 (2)插入数据的时候需要考虑前后的方向的操作 (3)同样,删除数据的是有也需要考虑前后方向的操作 那么,一个非循环的双向链表操作应该是怎么样的呢?我们可以自己尝试一下:原创 2011-11-27 22:01:27 · 243 阅读 · 0 评论 -
循环单向链表
前面的博客中,我们曾经有一篇专门讲到单向链表的内容。那么今天讨论的链表和上次讨论的链表有什么不同呢?重点就在这个"循环"上面。有了循环,意味着我们可以从任何一个链表节点开始工作,可以把root定在任何链表节点上面,可以从任意一个链表节点访问数据,这就是循环的优势。 那么在实现过程中,循环单向链表有什么不同? 1)打印链表数据 void print_data(const原创 2011-11-27 22:04:03 · 348 阅读 · 0 评论 -
排序二叉树
前面我们讲过双向链表的数据结构。每一个循环节点有两个指针,一个指向前面一个节点,一个指向后继节点,这样所有的节点像一颗颗珍珠一样被一根线穿在了一起。然而今天我们讨论的数据结构却有一点不同,它有三个节点。它是这样定义的:typedef struct _TREE_NODE{ int data; struct _TREE_NODE* parent; struct _TREE_NODE原创 2011-11-27 22:08:15 · 2468 阅读 · 0 评论 -
排序二叉树插入
二叉树的节点插入比较简单。一般来说,二叉树的插入主要分为以下两个步骤: 1) 对当前的参数进行判断,因为需要考虑到头结点,所以我们使用了指针的指针作为函数的输入参数 2) 分情况讨论: 如果原来二叉树连根节点都没有,那么这个新插入的数据就是根节点; 如果原来的二叉树有根节点,那我们判断这个数据是否存在过,如果存在,那么返回;如果不存在,那么继原创 2011-11-27 22:11:48 · 875 阅读 · 0 评论 -
排序二叉树删除2
2.4 删除节点的左右子树都存在,此时又会分成两种情形 1)左节点是当前左子树的最大节点,此时只需要用左节点代替根节点即可 /** * 10 ======> 6* / \ / \* 6 15 5原创 2011-11-27 22:32:30 · 487 阅读 · 0 评论 -
排序二叉树的保存和加载
排序二叉树是我们开发中经常使用到的一种数据结构,它具有较好的插入、删除、查找特性。但是由于二叉树的指针较多,所以相比较其他的数据结构而言,二叉树来得比较麻烦些。但是也不是没有办法,下面介绍一下我个人常用的方法。 我们知道,如果一个二叉树是一个满树的话,那么二叉树的节点应该是按照1、2、3、4依次排开的。但是现实情况是这样的,由于排序二叉树自身的特性,某个分支节点常常可能左半边有分支,右半原创 2011-11-27 22:46:35 · 321 阅读 · 0 评论 -
哈希表
hash表,有时候也被称为散列表。个人认为,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,但是数据查找十分麻烦;二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。 打个比方来说,所有的数据就好像许许多多的书本。如果这些书本是一本一本堆起来的,就好像链表或者线性表一样,整个数据会显得非原创 2011-11-27 22:49:38 · 302 阅读 · 0 评论 -
图结构
图是数据结构里面的重要一章。通过图,我们可以判断两个点之间是不是具有连通性;通过图,我们还可以计算两个点之间的最小距离是多少;通过图,我们还可以根据不同的要求,寻找不同的合适路径。当然,有的时候为了计算的需要,我们还需要从图中抽象出最小生成树,这样在遍历计算的时候就不需要持续判断是不是遇到了循环节点。当然,这所有的一切都是从图的表示开始的。 1)矩阵表示 矩阵表示可以说是最简单原创 2011-11-27 22:56:01 · 259 阅读 · 0 评论 -
合并算法
前面一篇博客提到的快速排序是排序算法中的一种经典算法。和快速排序一样,合并排序是另外一种经常使用的排序算法。那么合并排序算法有什么不同呢?关键之处就体现在这个合并上面。 合并算法的基本步骤如下所示: 1)把0~length-1的数组分成左数组和右数组 2)对左数组和右数组进行迭代排序 3)将左数组和右数组进行合并,那么生成的整个数组就是有序的数据数组原创 2011-11-27 21:19:53 · 540 阅读 · 0 评论 -
选择排序
选择排序是和冒泡排序差不多的一种排序。和冒泡排序交换相连数据不一样的是,选择排序只有在确定了最小的数据之后,才会发生交换。怎么交换呢?我们可以以下面一组数据作为测试: 2, 1, 5, 4, 9 第一次排序:1, 2, 5, 4, 9 第二次排序: 1, 2, 5, 4, 9 第三次排序: 1, 2, 4, 5, 9 第四次排序: 1, 2, 4,原创 2011-11-27 21:25:09 · 184 阅读 · 0 评论 -
基数排序
基数排序是另外一种比较有特色的排序方式,它是怎么排序的呢?我们可以按照下面的一组数字做出说明:12、 104、 13、 7、 9 (1)按个位数排序是12、13、104、7、9 (2)再根据十位排序104、7、9、12、13 (3)再根据百位排序7、9、12、13、104 这里注意,如果在某一位的数字相同,那么排序结果要根据上一轮的数组确定,举个例子来说:0原创 2011-11-27 21:28:53 · 282 阅读 · 0 评论 -
非递归排序
在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大。作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定。这中间的差别是非常明显的。既然排序有这么好的效果,那么这篇博客中,我们就对排序算做一个总结。 按照我个人的理解,排序可以分为两种:一种是非递归排序,它主要按照非递归的方法对数据进行排序,也就是说主要数原创 2011-11-27 21:34:29 · 230 阅读 · 0 评论 -
单向链表
有的时候,处于内存中的数据并不是连续的。那么这时候,我们就需要在数据结构中添加一个属性,这个属性会记录下面一个数据的地址。有了这个地址之后,所有的数据就像一条链子一样串起来了,那么这个地址属性就起到了穿线连结的作用。 相比较普通的线性结构,链表结构的优势是什么呢?我们可以总结一下: (1)单个节点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小 (2)原创 2011-11-27 21:51:22 · 235 阅读 · 0 评论 -
非递归排序
在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大。作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定。这中间的差别是非常明显的。既然排序有这么好的效果,那么这篇博客中,我们就对排序算做一个总结。 按照我个人的理解,排序可以分为两种:一种是非递归排序,它主要按照非递归的方法对数据进行排序,也就是说主要数原创 2011-11-27 21:37:20 · 469 阅读 · 0 评论 -
冒泡排序
在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大。作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定。这中间的差别是非常明显的。既然排序有这么好的效果,那么这篇博客中,我们就对排序算做一个总结。 按照我个人的理解,排序可以分为两种:一种是非递归排序,它主要按照非递归的方法对数据进行排序,也就是说主要数原创 2011-11-27 21:31:17 · 263 阅读 · 0 评论 -
堆排序
堆排序是另外一种常用的递归排序。因为堆排序有着优秀的排序性能,所以在软件设计中也经常使用。堆排序有着属于自己的特殊性质,和二叉平衡树基本是一致的。打一个比方说,处于大堆中的每一个数据都必须满足这样一个特性: (1)每一个array[n] 大于array[2*n] (2)每一个array[n]大于array[2 * n + 1] 构建这样一个堆只是基础,后面我们需要每次原创 2011-11-27 21:23:19 · 191 阅读 · 0 评论 -
八叉树算法
Octree的定义是:若不为空树的话,树中任一节点的子节点恰好只会有八个,或零个,也就是子节点不会有0与8以外的数目。那么,这要用来做什么?想象一个立方体,我们最少可以切成多少个相同等分的小立方体?答案就是8个。再想象我们有一个房间,房间里某个角落藏着一枚金币,我们想很快的把金币找出来,聪明的你会怎么做?我们可以把房间当成一个立方体,先切成八个小立方体,然后排除掉没有放任何东西的小立方体,再把有可能藏金币的小立方体继续切八等份….如此下去,平均在Log8(房间内的所有物品数)的时间内就可找到金币。因此,Oc原创 2010-08-26 15:54:00 · 5729 阅读 · 2 评论 -
经典图算法
#include // 常量定义: const int maxV = 100 ; const double Inf = 1e100; // const int Inf=2000000000; // Graph类定义: template struct GraphMatrix { int v; // 顶点数 int e; // 边数 T a[maxV][maxV]; // 邻接矩阵原创 2010-08-26 15:34:00 · 433 阅读 · 0 评论 -
关于LZW压缩算法
关于LZW压缩算法最近因为工作需要,研究了一下LZW压缩算法。觉得挺有意思,而且实现起来,也不是它“看上去的”那般容易——我前后折腾了5天才写出能正确工作的代码(上周4,5 + 周末 + 本周1,2)。写在blog里面,一来给自己留个笔记,另外如果有相同兴趣的人看到了,也许能有一些小小的帮助。LZW压缩算法给予是基于字典的LZ系列算法的改进型,gif文件格式中使用了这种算法来压缩位图,这个算法一直作为unisys公司的专利而存在,所以在开源的世界里,这个算法以前用的不多。我记得好像是到去年这个专利才在全球所原创 2010-09-24 10:33:00 · 305 阅读 · 0 评论 -
LZW压缩算法
LZW压缩算法是一种新颖的压缩方法,由Lemple-Ziv-Welch 三人共同创造,用他们的名字命名。它采用了一种先进的串表压缩不,将每个第一次出现的串放在一个串表中,用一个数字来表示串,压缩文件只存贮数字,则不存贮串,从而使图象文件的压缩效率得到较大的提高。奇妙的是,不管是在压缩还是在解压缩的过程中都能正确的建立这个串表,压缩或解压缩完成后,这个串表又被丢弃。1.基本原理 首先建立一个字符串表,把每一个第一次出现的字符串放入串表中,并用一个数字来表示,这个数字与此字符串在串表中的位置有关,并将原创 2010-09-24 16:27:00 · 492 阅读 · 0 评论 -
hash
暴雪公司有个经典的字符串的hash公式 先提一个简单的问题,假如有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做? 有一个方法最简单,老老实实从头查到尾,一个一个比较,直到找到为止,我想只要学过程序设计的人都能把这样一个程序作出来,但要是有程序员把这样的程序交给用户,我只能用无语来评价,或许它真的能工作,但...也只能如此了。 最合适的算法自然是使用HashTable(哈希表),先介绍介绍其中的基本知识,所谓Hash,一般是一个整数,通过某种算法,可原创 2010-12-08 14:21:00 · 181 阅读 · 0 评论 -
图
// g.cpp : Defines the entry point for the console application.//#include "stdafx.h"#define int_max 10000 #define inf 9999 #define max 20 //…………………………………………邻接矩阵定义…………………… typedef struct ArcCell { int adj; char原创 2010-12-14 16:54:00 · 248 阅读 · 0 评论 -
Huffman
// Huffman.cpp : Defines the entry point for the console application.//#include "StdAfx.h"#include #include #include #define NUM_CHARS 256 // number of characters in the character set#define MAX_SIZE 1000000 // maximal buffer size for input from file//原创 2011-01-05 22:31:00 · 754 阅读 · 0 评论 -
简单快速的哈夫曼编码
介绍 本文描述在网上能够找到的最简单,最快速的哈夫曼编码。本方法不使用任何扩展动态库,比如STL或者组件。只使用简单的C函数,比如:memset,memmove,qsort,malloc,realloc和memcpy。 因此,大家都会发现,理解甚至修改这个编码都是很容易的。 下载 (21.43 KB) 2010-7-10 22:04 背景 哈夫曼压缩是个无损的压缩算法,一般用来压缩文本和程序文件。哈夫曼压缩属于可变代码长度算法一族。意思是个体符号(例如,文本文件中的字符)用一个特定长度的位序列替代。因此,在原创 2010-11-19 15:26:00 · 307 阅读 · 0 评论 -
网络中两点最短路径 Dijkstra 算法
#define true 1#define false 0#define I 9999 /* 无穷大 */#define N 20 /* 城市顶点的数目 */int cost[N][N] = { {0,3,I,I,I,1,I,I,I,I,I,I,I,I,I,I,I,I,I,I}, {3,0,5,I,I,I,6,I,I,I,I,I,I,原创 2011-01-12 14:00:00 · 617 阅读 · 0 评论 -
六个经典算法研究
算法研究系列:精选24个经典的算法[一、A*搜索算法] ----July/编写==============博主说明:1、此经典算法研究系列,第一、二篇文章(后续文章越写越好),写的不够好,还望见谅。2、本经典算法研究系列,系我参考资料,一篇一篇原创所作,转载必须注明作者本人July及出处。3、本经典算法研究系列,会永久更新,希望,尽我所能,阐述尽可能多的世界经典算法。欢迎,各位,与我一同学习探讨,交流研究。有误之处,不吝指正。--原创 2011-01-15 09:18:00 · 2806 阅读 · 0 评论 -
进程同步实验(生产者与消费者问题算法实现)
1.实验目标和要求进程的同步是操作系统处理机管理的重要内容,本实验要求学生理解生产者与消费者问题模型,掌握解决该问题的算法思想,学会使用同步机制。2.实验内容一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。缓冲区1PQ缓冲区2缓冲区3缓冲区n-1缓冲区n放消息N个缓冲区取消息根据进程同步机制,编写一个解决上述问题的可视化程序,可显示缓冲池状原创 2010-11-23 11:35:00 · 6248 阅读 · 0 评论 -
银行家算法C++源程序及流程图
#include using namespace std;#define I 50 /*最大进程数*/#define J 100 /*最大资源数*/#define False 0#define True 1int Available[J]; /*可利用资源数*/int MAX[I][J]; /*最大需求矩阵*/int Allocation[I][J]; /*分配矩阵*/int Need[I][J]; /*需求矩阵*/原创 2011-04-21 09:58:00 · 2403 阅读 · 0 评论 -
快速排序
快速排序是编程中经常使用到的一种排序方法。可是很多朋友对快速排序有畏难情绪,认为快速排序使用到了递归,是一种非常复杂的程序,其实未必如此。只要我们使用好了方法,就可以自己实现快速排序。 首先,我们复习一下,快速排序的基本步骤是什么: 1、 判断输入参数的合法性 2、把数组的第一个数据作为比较的原点,比该数据小的数据排列在左边,比该数据大的数据排列在右边 3、原创 2011-11-27 21:17:07 · 218 阅读 · 0 评论 -
线性堆栈
前面我们讲到了队列,今天我们接着讨论另外一种数据结构:堆栈。堆栈几乎是程序设计的命脉,没有堆栈就没有函数调用,当然也就没有软件设计。那么堆栈有什么特殊的属性呢?其实,堆栈的属性主要表现在下面两个方面: (1)堆栈的数据是先入后出 (2)堆栈的长度取决于栈顶的高度 那么,作为连续内存类型的堆栈应该怎么设计呢?大家可以自己先试一下: (1)设计堆栈节点原创 2011-11-27 21:47:11 · 289 阅读 · 0 评论 -
排序二叉树删除1
相比较节点的添加,平衡二叉树的删除要复杂一些。因为在删除的过程中,你要考虑到不同的情况,针对每一种不同的情况,你要有针对性的反应和调整。所以在代码编写的过程中,我们可以一边写代码,一边写测试用例。编写测试用例不光可以验证我们编写的代码是否正确,还能不断提高我们开发代码的自信心。这样,即使我们在开发过程对代码进行修改或者优化也不会担心害怕。然而看起来编写测试用例是一个繁杂的过程,但是从长期的收益来看原创 2011-11-27 22:18:46 · 1218 阅读 · 0 评论 -
排序二叉树删除3
3 普通节点的删除 3.1 删除的节点没有左子树,也没有右子树 测试用例1: 删除节点6/** * 10 ======> 10* / \ \* 6 15 15*原创 2011-11-27 22:38:37 · 538 阅读 · 1 评论