
算法设计
eastlhu
这个作者很懒,什么都没留下…
展开
-
一些重要的算法
下面是一些比较重要的算法,原文罗列了32个,但我觉得有很多是数论里的或是比较生僻的,和计算机的不相干,所以没有选取。下面的这些,有的我们经常在用,有的基本不用。有的很常见,有的很偏。不过了解一下也是好事。也欢迎你留下你觉得有意义的算法。(注:本篇文章并非翻译,其中的算法描述大部份摘自Wikipedia,因为维基百科描述的很专业了)A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求...转载 2018-04-21 10:30:50 · 232 阅读 · 0 评论 -
动态规划解最长公共子序列问题
动态规划法经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。【问题】 求两字符序列的最长公共字符子序列转载 2014-04-03 17:15:20 · 582 阅读 · 0 评论 -
hash表进阶
散列法的基本思想是把键分布在一个称为散列表的一维数组H[0.......m-1]中,我们可以对每个键计算某些被称为散列函数的预定义函数h的值,来完成这种分布。该函数为每个键确定它在H中的下标。一般来说,hash函数的要求:1)使得键在hash表里尽可能均匀的分布2)hash函数必须容易计算显然,如果选择的散列表长度m小于键的数量n,则会碰撞。这是一种2个或多个键转载 2014-04-03 22:53:51 · 781 阅读 · 0 评论 -
KMP算法深度解析
摘要:KMP算法是字符串匹配的经典算法,由于其O(m+n)的时间复杂度,至今仍被广泛应用。大道至简,KMP算法非常简洁,然而,其内部却蕴含着玄妙的理论,以至许多人知其然而不知其所以然。本文旨在解开KMP算法的内部玄妙所在,希望能够有助于学习与理解。 1、KMP算法 一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此称之为KMP算转载 2014-04-03 23:23:32 · 548 阅读 · 0 评论 -
动态规划0—1背包问题
动态规划0-1背包问题Ø 问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?Ø 对于一种物品,要么装入背包,要么不装。所以对于一种物品的装入状态可以取0和1.我们设物品i的装入状态为xi,xi∈ (0,1),此问题称为0-11背包问题。转载 2014-04-04 00:11:25 · 650 阅读 · 0 评论 -
经典排序算法之——希尔排序
希尔排序(shellsort)又叫增量递减(diminishing increment)排序,是由D.L. Shell发明的,这个算法是通过一个逐渐减小的增量使一个数组逐渐趋近于有序从而达到排序的目的。希尔排序的实质就是分组插入排序,该方法又称缩小增量排序。 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依原创 2014-02-24 17:08:06 · 934 阅读 · 0 评论 -
经典排序算法之——归并排序
归并排序的主要思想是:把两个已经排序好的序列进行合并,成为一个排序好的序列。例如:13579 2468这两个序列,各自都是排好序的,然后我们进行合并,成为123456789这样一个排好序的序列。貌似这个跟排序关系不大,因为排序给的是一个乱的序列,而合并是合并的两个已经排序好的序列。且慢,我们可以把需要排序的数据分解成N个子序列,当分解的子序列所包含数据个数为1的时候,那么这个序列不原创 2014-02-24 17:13:45 · 1292 阅读 · 0 评论 -
经典排序算法之——冒泡排序
冒泡排序是最简单的排序方法之一,看了代码都能懂的。//冒泡排序void bubbleSort(int sort[],int len){ int i=0,j=0,temp=0,flag=0; for (i=0;i<len-1;i++) { for (j=0;j<len-1;j++) { if (sort[j]>sort[j+1]) { temp=sort[j原创 2014-02-24 17:18:02 · 736 阅读 · 0 评论 -
经典排序算法之——基数排序
一. 算法描述基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位。主要分为两个过程:(1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中)(2)收集,再将放置在0~9号桶中的数据按顺序放到数组中重复(1)(2)过程,从个位到最高位(比如32位无符号整形最大数4294967296,最高位10位)以【52原创 2014-02-24 19:33:50 · 825 阅读 · 0 评论 -
哈希散列冲突线性探测再散列算法
题目:已知一个线性表(38,25,74,63,52,48),假定采用散列函数h(key) = key%7计算散列地址,并散列存储在散列表A【0....6】中,若采用线性探测方法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为()解题步骤:线性表(38,25,74,63,52,48)1:进行38这个数据处理 :38%7 = 3,直接把38放在3这个位置1[0][1][2][转载 2014-03-02 00:04:34 · 2677 阅读 · 0 评论 -
查找----深入探索散列查找
1、散列函数 把任意长的输入消息串变化成固定长的输出串的一种函数。这个输出串称为该消息的杂凑值。一般用于产生消息摘要,密钥加密等。常见的散列函数构造方法如下: (1)直接定址法 例如:有一个从1到100岁的人口数字统计表,其中,年龄作为关键字,哈希函数取关键字自身。 (2)数字分析法 有学生的生日数据如下: 年.月.日 75.10.03 7转载 2014-03-02 00:11:49 · 592 阅读 · 0 评论 -
Bloom Filter概念和原理
Bloom Filter概念和原理焦萌 2007年1月27日 Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter转载 2014-04-03 23:24:10 · 525 阅读 · 0 评论 -
深入理解Bloom Filter
Bloom Filter是1970年由Bloom提出的,最初广泛用于拼写检查和数据库系统中。近年来,随着计算机和互联网技术的发展,数据集的不断扩张使得 Bloom filter获得了新生,各种新的应用和变种不断涌现。Bloom filter是一个空间效率很高的数据结构,它由一个位数组和一组hash映射函数组成。Bloom filter可以用于检索一个元素是否在一个集合中,它的优点是空间效率和查询时转载 2014-04-03 23:21:47 · 562 阅读 · 0 评论 -
A星寻路算法介绍
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢?如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它!在网上已经有很多篇关于A星寻路算法的文章,但是大部分都是提供给已经了解基本原理的高级开发者的。本篇教程将从最基本的原理讲起。我们会一步步讲解A星寻路算法,幷配有很多图解和例子。不管你使用的是什么编程语言或者操作平台,你会发转载 2015-11-10 10:30:39 · 803 阅读 · 0 评论 -
动态规划——01背包问题
Ø 问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?Ø 对于一种物品,要么装入背包,要么不装。所以对于一种物品的装入状态可以取0和1.我们设物品i的装入状态为xi,xi∈ (0,1),此问题称为0-11背包问题。原创 2014-04-07 21:05:03 · 1004 阅读 · 0 评论 -
单链表逆序(递归&非递归)
结点定义:[cpp] view plaincopystruct Node { int data; Node *next; }; 方法一:设置两个临时指针pre和ne分别标记当前指针的前驱和后继,将当前结点的next指针指向前驱,然后把前驱指针和当前指针往后移动,继续遍历,当然每次移动后都要重新标记当前结点的后转载 2014-04-21 17:21:12 · 766 阅读 · 0 评论 -
Linux下实现Huffman编码压缩算法
转自:http://blog.youkuaiyun.com/sunrier/article/details/7728488//stack.h[cpp] view plain copy/************************************************************* FileName : stack.h转载 2017-05-29 14:06:28 · 693 阅读 · 0 评论 -
经典排序算法之——堆排序
堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i原创 2014-02-24 14:01:31 · 745 阅读 · 0 评论 -
经典排序算法之——选择排序
选择排序很简单,遍历整个数组,找到最小的,记住这个最小的index,与当前值交换,如此循环废话不多说,直接上代码://选择排序void select_sort(int sort[],int count){ int index=0,tmp,min=0; for(int i=0;i<count-1;i++) { min=sort[i];原创 2014-02-24 17:16:24 · 688 阅读 · 0 评论 -
经典排序算法之——插入排序
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。设数组为a[0…n-1]。1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=12. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。3. i原创 2014-02-24 16:24:34 · 773 阅读 · 0 评论 -
linux c语言定时器
linux定时器的使用使用定时器的目的无非是为了周期性的执行某一任务,或者是到了一个指定时间去执行某一个任务。要达到这一目的,一般有两个常见的比较有效的方法。一个是用linux内部的三个定时器,另一个是用sleep, usleep函数让进程睡眠一段时间,其实,还有一个方法,那就是用gettimeofday, difftime等自己来计算时间间隔,然后时间到了就执行某一任务,但是这种方法效率低,转载 2015-11-19 10:26:05 · 583 阅读 · 0 评论 -
按位异或运算交换两个变量的值原理
按位异或运算是指两个相应的二进制相同时结果为0,否则为1。若欲交换两个变量的值,而又不借助其他的中间变量,那么在C++中可以用下面的语句: a = a ^ b; //语句1 b = a ^ b; //语句2 a = a ^ b; //语句3 主要的原理是:(转载 2015-11-16 14:17:21 · 5269 阅读 · 0 评论 -
正则表达式30分钟入门教程
目录跳过目录本文目标如何使用本教程正则表达式到底是什么东西?入门测试正则表达式元字符字符转义重复字符类分枝条件反义分组后向引用零宽断言负向零宽断言注释贪婪与懒惰处理选项平衡组/递归匹配还有些什么东西没提到联系作者网上的资源及本文参考文献更新纪录本文目标30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。如何使用本教程最重要的是转载 2014-03-02 16:12:09 · 592 阅读 · 0 评论 -
常见hash算法的原理
散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。转载 2014-03-02 00:08:25 · 1019 阅读 · 0 评论 -
构造散列函数
一、散列函数的选择有两条标准:简单和均匀。 简单指散列函数的计算简单快速; 均匀指对于关键字集合中的任一关键字,散列函数能以等概率将其映射到表空间的任何一个位置上。也就是说,散列函数能将子集K随机均匀地分布在表的地址集{0,1,…,m-1}上,以使冲突最小化。二、常用散列函数 为简单起见,假定关键字是定义在自然数集合上。(1)平方取中法转载 2014-03-02 00:09:44 · 848 阅读 · 0 评论 -
二叉查找树(二叉排序树)的详细实现(BST)
1、序 详细实现了二叉查找树的各种操作:插入结点、构造二叉树、删除结点、查找、 查找最大值、查找最小值、查找指定结点的前驱和后继2、二叉查找树简介 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树3、转载 2014-02-26 14:15:06 · 952 阅读 · 0 评论 -
统计文章内各个单词出现的次数 (STL)
在vs2010下运行算法的思路是:从头到尾遍历文件,从文件中读取遍历到的每一个单词。把遍历到的单词放到hash_map中,并统计这个单词出现的次数。遍历hash_map,将遍历到的单词的出现次数放到优先级队列中。当优先级队列的元素个数超过k个时就把元素级别最低的那个元素从队列中取出,这样始终保持队列的元素是k个。遍历完hash_map,则队列中就剩下了出现次数最多的那k个元素。转载 2014-04-03 20:48:29 · 1118 阅读 · 0 评论 -
有关统计单词频率的算法c语言实现
从一文本中读取单词,统计其出现的频率,并按频率大小输出到另一文本中。这里的单词是分二种,一种是ASCII码大于0x20小于0X80字符,第 二种是小于0x20以及大于0x80的字符。这里我用的是哈希表,这样能很快查找读取的单词是否已经存在。排序我用的是二个循环,按理来说可以改进。下面是我的算法。有些地方还需要改进。#include #include #include #de转载 2014-04-03 21:15:56 · 1694 阅读 · 0 评论 -
Huffman 编码压缩算法
你应该听说过 David Huffman 和他的经典的压缩算法—— Huffman Code,这是一种通过字符出现频率,Priority Queue,和二叉树来进行的一种压缩算法,这种二叉树又叫 Huffman 二叉树 —— 一种带权重的树。但是网上查了一下,中文社区内好像没有把这个算法说得很清楚的文章,尤其是树的构造,而正好看到一篇国外的文章《A Simple Example of Huff转载 2014-04-29 10:52:02 · 964 阅读 · 0 评论 -
最简单的动态规划之POJ1063
对于算法的五大分类,基本上就是递归和回溯,分治,动态规划,贪心,搜索和剪枝。最近写程序写的少,算法看的也不多,用个最简单的程序总结一下动态规划。顺便测试一下刚刚下的Syntax Highlighter 插件好不好用。原题见:http://acm.pku.edu.cn/JudgeOnline/problem?id=1163 求从顶端到低端的最长路径(约束条件为:沿对角线方向走)简单转载 2014-04-10 11:49:47 · 614 阅读 · 0 评论 -
判断一个链表中是否有环
如何判断一个链表中是否存在环:设置两个指针,开始都指向链表头,然后其中一个指针每次向前走一步,另一个指针每次向前走两步,如果快的遇到NULL了,证明该链表中没有环,如果有环,快的指针每次都要比慢的多走一步,最终两个指针会相遇,(注意:这里快指针不会跳过慢指针而不相遇,因为它每次都只比慢指针多走一个单位)转载 2014-04-21 17:28:13 · 713 阅读 · 0 评论 -
C语言一个队列的实现
C语言一个队列的实现 头文件Queue.h#ifndef Queue_H#define Queue_Htypedef int Item;typedef struct node * PNode;typedef struct node{ Item data; PNode next;}Node;typedef struct{ PNode front; PNod原创 2014-04-20 10:37:30 · 8933 阅读 · 0 评论 -
C语言实现双向链表
首先编写头文件,头文件里做相关的定义和声明,DList.h内容如下:[cpp] view plaincopy#ifndef DList_H #define DList_H typedef int Item; typedef struct Node * PNode; typedef PNode Position; /*定义节点类型*/ typedef str转载 2014-04-20 10:41:52 · 733 阅读 · 0 评论 -
C语言实现栈
C语言实现栈typedef struct { int *base; int *top; int stackSize;}sqStack;int initStack(sqStack &s){ s.base=(int *)malloc(sizeof(sqStack)*STACK_INIT_SIZE); if (!s.base) { exit(OVERFLOW); }原创 2014-04-20 10:34:43 · 715 阅读 · 0 评论 -
字符串匹配KMP算法
详细算法描述见《算法导论32.4》,以下是C实现:[cpp] view plaincopy#include #include #include //预处理:所需时间为O(m),空间O(m) void compute_prefix_func(char sp[], int p[]) { int m, k, q; m = strlen(转载 2014-04-20 10:25:29 · 663 阅读 · 0 评论 -
平衡二叉树
平衡二叉树(解惑)平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉树:它的左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。平衡因子(bf):结点的左子树的深度减去右子树的深度,那么显然-1很显然,平衡二叉树是在二叉排序树(BST)上引入的,就是为了解决二叉排序树的不平衡性导致时间复杂度大大下降,那么AVL就保持住了(BST转载 2014-06-04 23:33:49 · 588 阅读 · 0 评论 -
红黑树
红黑树转自:之前看了很多写红黑树的博客,但是感觉都讲的不太清楚!没说这样操作如何使他保持平衡的,于是疑惑重重,就看不下去了,一次不经意看到一个人说维基百科的红黑树讲的好,我就随便点了一下一看——这下疯了~,怎么讲的这么好!可以说是把一个复杂的问题,讲得简单化!这太幸福了! 于是我就慢慢学会了!强烈推荐维基的这个讲解,再也找不到比这还好的讲解了!不知道它上边其它的怎么样,反正这个很好!!转载 2014-06-04 23:32:16 · 556 阅读 · 0 评论 -
数据结构复习之【排序】
排序:对一序列对象根据某个关键字进行排序;稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成;外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 排序耗时的操作:比较、移动;排序分类:(1)交换类:冒泡原创 2013-09-09 22:47:46 · 885 阅读 · 0 评论 -
C链表操作
标一下转的. 别人心心苦苦写的.C链表操作复习数据结构和C,顺便动手实践一下比较好,便于理解,加深印象几乎都是书上的算法,翻译成C了,没什么讲的#includestdio.h>#includestdlib.h>struct iNode{ int data; struct iNod转载 2013-10-19 11:52:40 · 1058 阅读 · 0 评论 -
二叉树的线索化
在二叉树的二叉链表表示实现的时候,当以二叉树作为存储结构时,只能找到节点的左右孩子信息,不能直接得到结点在任一序列中的前驱和后继信息,只有在遍历过程中才能得到这种信息。我们知道,在n个结点的二叉链表栈必定存在n+1个空链域,因此,可以利用这些空链域来存放这些结点信息。所以作如下规定:若结点右左子树,则其lchild域指向其左孩子,否则令lchild域指向其前驱;若结点有右子树,其rchild域指向转载 2013-11-08 18:35:31 · 913 阅读 · 0 评论