笔记-算法精解C语言实现
张勇1234
这个作者很懒,什么都没留下…
展开
-
算法精解----2、算法分析
1、评价算法的三种基本情况:最佳情况、平均情况、最坏情况 2、O表示法指明一个函数的上限值。 3、 4、NP完全问题: 没有已知的求解多项式时间的算法,但也无法证明此多项式不存在原创 2017-07-29 16:04:35 · 272 阅读 · 0 评论 -
算法精解----12、二叉树的实现及应用-表达式处理
1、树的平衡:对于指定数量的节点,保证树的高度尽可能短。即节点加入下一层之前必须保证本层节点满。2、AVL树是平衡二叉搜索树的一种。3、四种周游算法:先序遍历、中序遍历、后序遍历、层级遍历 4、二叉树实现代码 (1)数据结构//节点typedef struct _BIT_TREE_NODE{ void *data; struct BIT_TREE_NODE *left;原创 2017-08-09 21:00:56 · 494 阅读 · 0 评论 -
算法精解----13、二叉搜索树-AVL树
1、树的组织方式:左节点小于根节点,右节点大于根节点。平衡二叉树最坏情况log2 (n)。顺序排列只有单支最坏情况为n。可以采取随机插入等方式解决此问题,其中最好的方法就是 二叉搜索树实现AVL树。2、AVL树:每个节点额外保存一个平衡因子,值为右子树高度减去左子树高度。插入节点时,AVL树需要自我调整保持所有平衡因子值为-1(左倾斜)、0、+1(右倾斜)。根节点的平衡因子代表整个树的平衡性。3、实原创 2017-08-10 22:43:58 · 285 阅读 · 0 评论 -
算法精解----14、堆
1、用途快速找到最大或最小元素,父节点始终大于或小于左右节点,左右节点之间没有关系。最底层最右端的节点就是最后一个节点。 2、节点成S行自上而下,自左向右顺序编号。元素对应在数组当中。若父节点编号为n,那么左右节点分别为2n+1,2n+2。可以随机访问,虽然属于二叉树,但是不用指针把每个节点串起来体现节点之间的关系。原创 2017-08-12 11:43:03 · 208 阅读 · 0 评论 -
算法精解----16、图
1、图作为一种模型来定义对象之间的关系。对象由顶点表示,而对象之间的关系则通过顶点之间的边来表示。2、图分为有向图和无向图,有向图的边叫做弧。 3、图的表达式:G = (V, E),E包含有序对(u,v),对于无向图无所谓(u,v)和(v,u)。 如上图,有向图:V={v0, v1, v2, v3}. E={(v0,v1), (v2, v0), (v2, v3), (v3, v0)}. 无向原创 2017-08-14 22:18:41 · 359 阅读 · 0 评论 -
算法精解----17、图的应用
知识小结: (1)链表可以动态扩展和收缩,这是较数组的优点 (2)互联网建模,关节点代表单点故障源,如果该点出错则系统无法通信。因此在设计保持长时间连接的大型网络架构时,很重要的一点就是保证网络中没有关节点。 (3)有向图很适合状态机建模 (4)超图:包含超边,即可以连接任意数量顶点的边 (5)多重图:允许在相同的两个顶点间有多条边存在 (6)邻接矩阵表示法:V*V阶矩阵,V 顶点个数原创 2017-08-15 22:51:19 · 1144 阅读 · 0 评论 -
算法精解----1、指针与递归
一、指针 1、 指针只是一个变量,它存储数据在内存中的地址而不是存储数据本身。C语言中指针变量拥有和其他变量一样的类型。当声明一个指针时,仅仅是为指针本身分配了空间,并没有为指针所引用的数据分配空间。结构不允许包含自身的实例,但可以包含指向自身实例的指针。指针的运算是加减对应指向数据类型的字节数。数组*(*(a+i)+j) a是个二位指针,先指向某行,在指向某列。对于二维数组声明,列元素个数必须原创 2017-07-28 16:56:02 · 741 阅读 · 0 评论 -
算法精解----3、单链表
1、链表需要动态开辟存储空间,链表元素连接在一起,但在内存空间中它们是分散开的。2、单链表只能以一个方向进行遍历3、释放的是data指向的内存,而不是分配给指针变量data本身的内存空间int *data;data = (int*)malloc(sizeof(int));free(data);4、single_list.h#ifndef SINGLE_LIST_H#define SINGLE_原创 2017-08-01 14:40:23 · 256 阅读 · 0 评论 -
算法精解----4、双向链表
1、标识头和尾:第一个元素的prev和最后一个元素的next指向NULL。 2、dlist.h#ifndef _DLIST_H#define _DLIST_Htypedef struct _DLIST_ELEMENT{ void *data; struct _DLIST_ELEMENT *prev; struct _DLIST_ELEMENT *next;}DLIS原创 2017-08-01 16:39:03 · 194 阅读 · 0 评论 -
算法精解----6、栈和队列
1、栈是先进后出(FILO),队列是先进先出(FIFO)。 2、栈和队列都可以定义为链表,只是插入和删除节点的操作位置不同。栈:出入栈都是插入或删除头部节点。队列:都是插入或删除尾部节点。typedef LIST STACK;int stack_push(STACK *stack, const void *data){ return list_ins_next(stack, NULL,原创 2017-08-02 17:07:39 · 172 阅读 · 0 评论 -
算法精解----7、集合
1、集合的特性:无序性、唯一性 2、集合运算原创 2017-08-03 15:42:21 · 237 阅读 · 0 评论 -
算法精解----8、集合应用-集合覆盖问题
1、问题具象: 有选手集合P={A1,A2,…}。每个选手有一个或多个技能。所有技能集合S={a,b,c,d,e,f,…..}。要求:选出最佳选手集合,包含所有技能,人员集合C。2、解决方案:集合覆盖法(贪心法思路,不一定是最优解) (1)选出有最多技能的人员Amax (2)S中去掉Amax中的技能;P中去掉Amax (3)循环找出下一个相对Amax,知道S中技能为0。3、数据结构//S:S原创 2017-08-04 16:28:25 · 5483 阅读 · 0 评论 -
算法精解----9、链式哈希表
1、哈希表 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)原创 2017-08-08 11:17:16 · 3261 阅读 · 0 评论 -
算法精解----11、开地址哈希表
链式哈希表中,每个元素放在桶中,桶的深度可扩展所以元素m不限。插入新元素效率和桶的深度均匀度有关,每个桶中的元素插入为顺序即要找到桶中第一个空位。而开地址哈希表元素存在表本身,如果顺序插入则随着元素的增多效率越低。每个表有其编号,根据哈希函数决定插入方式,可以更早找到空位,可以提升效率。开地址哈希表本质上是一个数组,数组的优势在于可以使用下标随机访问成员。**data表示是个存着指针的数组。1、初始原创 2017-08-08 22:54:49 · 277 阅读 · 0 评论 -
28、几何算法-线段相交、凸包、球面弧长
1、判断线段是否相交 (1)标准方法:如果两直线不平行先求直线交点,再看这个交点是否分别在两个线段上。(2)标准方法方法涉及到除法,计算机中一般方法:先判断以两个线段作为对角线的矩形是否相交,如果矩形相交再判断以一个线段为轴,另一个线段的两个端点是否分别位于顺时针和逆时针方向。 int lint(Point p1, Point p2, Point p3, Point p4){ doub原创 2017-08-30 23:18:02 · 1360 阅读 · 0 评论 -
算法精解----5、链表应用-虚拟内存页帧管理
1、系统物理地址空间可能没有实际地址空间大(即虚拟地址空间,由地址线长度决定)。虚拟内存是一种地址空间映射机制,它允许进程(运行的程序)不必完全加载到物理内存中也可以得到运行,进程操作的是虚拟地址。2、虚拟内存与物理内存的映射关系由页表中的条目决定,MMU会根据进程号和进程所使用的虚拟内存自动转换到对应实际操作的物理空间。虚拟内存空闲页就通过链表一页一页串起来。3、 每个链表的节点(DLIST_E原创 2017-08-01 19:45:49 · 375 阅读 · 0 评论 -
算法精解----18、插入排序,快速排序
1、插入排序:每次从无序数据集中取出一个元素,扫描已排好的数据集,把这个元素插入有序集的合适位置。 特点:简单,但不适合处理大型数据集,不需要额外空间,最坏O(n2),在增量排序中非常高效。 int issort(void *data, int size, int esize, int (*compare)(const void *key1, const void *key2)){ i原创 2017-08-17 11:17:19 · 257 阅读 · 0 评论 -
算法精解----19、归并排序、计数排序、基数排序
1、归并排序是另一种运用分治排序的算法,它的不同在于归并过程-将两个有序的数据集合合并成一个有序的数据集。 所有情况下都能达到快速排序的平均性能,但是需要额外的存储空间来运行,因为合并过程不能在无序数据本身运行。 会按照分的方式合,不用担心是否为2的幂。 //把排序好的两堆合并成一堆 //i为头,k为尾;i 到 j;j+1 到 k static int merge(void *data,原创 2017-08-17 22:30:11 · 268 阅读 · 0 评论 -
20、二分查找的实现与应用
1、二分查找法实质是不断将有序数据集合进行对半分割,并检查每个分区的中间元素。二分查找是对一个有序数据集合所做的操作。相对于查找,维护一个有序数据集的代价更高。当待搜索的集合是相对静态的数据集合时,如数组。使用二分查找法是最好的选择。这里的left、middle、right都是指数组下标 int bisearch(void *sorted, const void *target, int size原创 2017-08-18 15:10:00 · 395 阅读 · 0 评论 -
算法精解----15、优先队列应用-包裹分拣
1、优先队列将数据按照优先级顺序排列,优先队列在堆的基础上构建。2、包裹分拣,取包裹时只关心当前队列中优先级最高的包。3、数据结构typedef Heap PQueue;typedef struct _Parcel{ int mumber; int data;}Parcel;#define pqueue_init heap_init#define pqueue_destr原创 2017-08-12 16:04:40 · 595 阅读 · 0 评论 -
21、多项式插值,最小二乘法和牛顿迭代法
1、多项式插值 利用函数f (x)在某区间中已知的若干点的函数值,作出适当的特定函数,在区间的其他点上用这特定函数的值作为函数f (x)的近似值,这种方法称为插值法。如果这特定函数是多项式,就称它为插值多项式。 //*x、*fx分别为已知点数组(x0,f(x0))..(xn,f(xn));n为已知点个数// *z、*fz分别为待求点数组(z0,f(z0))..(zn,f(zn));m为待求点原创 2017-08-18 17:41:26 · 2726 阅读 · 0 评论 -
24、数据加密-DES
1、密码的安全性不依赖算法的保密性,而依赖于密钥。加密算法分类:对称加密算法,加密和解密使用同一个密钥;非对称加密算法,加密使用公钥,解密使用私钥。 2、DES(Data Encryption Standard):最流行对称加密算法。明文64bit为一组进行加密。加密过程根据64bit初始密钥生成的16个48位子密钥K1-K16进行。 一、生成子密钥 (1)初始密钥K0,根据密钥转换表64原创 2017-08-24 21:44:18 · 435 阅读 · 0 评论 -
22、数据压缩-霍夫曼编码
1、最小冗余编码:给出现的符号编码,使用较少的位对应出现频率高的符号编码,较多的位给出现频率较低的符号编码。霍夫曼编码基于此。 2、数据结构//霍夫曼树的节点,即data指向的内容,包含符号和频率typedef struct Huffnode_{ unsigned char symbol; int freq;}HuffNode;//每个符号对应的编码表typedef原创 2017-08-21 22:54:56 · 472 阅读 · 0 评论 -
25、数据加密-RSA
1、RSA公钥加密算法,是目前最有影响力和最常用的公钥加密算法。RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。 为了保证安全性,p、q不能泄露2、概念 (1)互素数:当两个整数的唯一公因子为1,则这两个数是互素的。 (2)欧拉函数:所有小于n且和n互素的正整数个数。 3、过程 所选择的分组位数原创 2017-08-25 14:46:04 · 318 阅读 · 0 评论 -
23、LZ77压缩和解压
1、LZ77是基于字典的算法,和霍夫曼编码不同,其处理的符号不一定是文本字符,可以是任何大小的符号。 2、LZ77使用前向缓冲区(待编码区的小段)和一个滑动窗口(搜索区)实现。滑动窗口是个历史缓冲器,它被用来存放输入流的前n个字节的有关信息。前向缓冲区是与动态窗口相对应的,它被用来存放输入流的前n个字节。算法主要思想就是在前向缓冲区中不断寻找能够与字典中短语匹配的最长短语。如果匹 配的数据长度大于原创 2017-08-23 16:53:39 · 12937 阅读 · 8 评论 -
26、图算法-最小生成树、最短路径
1、带权图,每个边附带一个值或权 (1)最小生成树:以最小代价将一个无方向的带权图的所有节点连起来,除根节点外,每个节点都有一个父节点所以叫最小生成树。 (2)最短路径:连接一个有方向的带权图中两个顶点之间代价的最小距离 (3)旅行商问题:寻找能够遍历一个完整且无方向带权图中每个顶点(仅一次),并且最终返回到起始顶点的路径。2、最小生成树Prim算法 起始:把所有节点键值置为无穷大,根节点置原创 2017-08-28 23:29:15 · 852 阅读 · 1 评论 -
27、图算法-最短路径应用(路由表)、旅行商问题
1、路由表 路由:将数据从一个点传输到另一个点(中间会有很多其他点)的决策过程。 网关:节点,负责传播数据段或数据包 路由表:存储互联网的结构信息或拓扑信息,它为每个路由器如何到达网关存储一个条目 SPF路由:最短路径路由,每个路由器都维护有自己的网路图,以便计算自身与其他节点之间的最短路径来更新其路由表。//paths最短路径生成的数,每个节点包含d 和父节点信息;destination:原创 2017-08-29 20:43:57 · 2542 阅读 · 0 评论 -
算法精解----10、链式哈希表的应用-符号表
应用简介:哈希表会应用于编译器中,满足快速存取符号信息的需求。把源码中有组织的字符转换为有意义的字符串(语义转换),一般保存符号的两个属性:语义和标记类型。每次从输入字符串流中接收一个字符串,默认字符串之间以空格隔开。如果该字符串为全数字标价记为digit;否则为other。#include <stdio.h>#include <ctype.h>#include <stdlib.h>#incl原创 2017-08-08 19:01:26 · 402 阅读 · 0 评论