
算法
Nestler
这个作者很懒,什么都没留下…
展开
-
散列表
散列表是一种ADT。散列表的实现常常叫做散列(hashing),它是一种用于以常数平均时间执行插入、删除、查找的技术。需要元素间任何排序信息的操作将不会得到有效的支持。例如FindMax、FindMax、按序输出等。散列表的关键是确定散列函数,《数据结构与算法分析》中提到了几种散列函数,但都不是完美的。能解决冲突但有可能散列表占用率不高。字符串中的字符不是随机出现,这也影响到了散列表的原创 2014-05-15 20:13:02 · 1028 阅读 · 0 评论 -
【算法】打靶问题求解
问题描述:打一枪可能的环数为0~10,求打10枪总环数为90的概率。这是一道排列组合问题,可以用循环加递归的方法解决。比如,第一次可以打出0~10环,那么先固定第一次打的环数,然后加上剩下的九次打的环数,就得到总环数。而剩下九次的环数通过递归很容易求得。代码如下:#include using namespace std;int cnt = 0;int target = 90;原创 2014-07-27 13:44:24 · 5139 阅读 · 0 评论 -
【STL】算法 — partial_sort
partial_sort接受一个middle迭代器,使序列中的middle-first个最小元素以递增顺序排序,置于[first, middle)内。下面是测试代码:#include #include #include using namespace std; int main(){ int a[] = {10,9,8,7,6,5,4,3,2,1,0}; vec原创 2014-05-15 12:05:01 · 8245 阅读 · 0 评论 -
【STL】算法 — sort
能使用STL的sort系列算法的前提是容器的迭代器必须为随机迭代器。所以,vector和deque天然适用。STL的sort算法采用了一些策略,在不同情况下采用不同的排序算法,以达到各种算法优势互补的效果。基本的原则是:数据量大时采用快速排序,数据量小时采用插入排序(这是对快排常用的一种优化策略),递归层次过深改用堆排序。首先是插入排序。它的平均和最坏时间复杂度都为O(N²),量级小于原创 2014-05-16 10:54:39 · 1379 阅读 · 0 评论 -
【STL】算法 — copy
为了效率,copy算法可谓无所不用其极,通过分析copy算法能够体会STL的精妙。首先是三个对外接口:template // 泛化版本inline OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result){原创 2014-05-14 10:12:12 · 1861 阅读 · 0 评论 -
main.c
#include #include #include #include #include #include #include #include #include #include #include #include #include #include "myqueue.h"#include "myvector.h"#include "mystl.h"#includ原创 2014-09-19 09:27:28 · 1002 阅读 · 0 评论 -
sort.cpp
#include #include #include using namespace std;// 冒泡排序void BubbleSort(int a[], int len){ if (a == NULL || len <= 0) return; bool swapped; int last = len - 1; do { swapped = false;原创 2014-09-19 09:30:44 · 1283 阅读 · 0 评论 -
heap.cpp
#include using namespace std;struct HeapStruct;typedef struct HeapStruct *PriorityQueue;PriorityQueue Initialize(int MaxElements);void Destroy(PriorityQueue H);void MakeEmpty(PriorityQueue H)原创 2014-09-19 09:29:21 · 1070 阅读 · 0 评论 -
dp.cpp
#include #include #include #include using namespace std;// 动态规划求解背包问题void knapsack(int weight[], int value[], int n, int W){ // V[i][j]表示i个物品放入承重为j的背包中 int **V = new int*[n + 1]; for (int原创 2014-09-19 09:28:08 · 1084 阅读 · 0 评论 -
数字哑谜和回文游戏
编程之美4.10的两道题。第一题:找出符合条件的九位数,每位数互不相同(1~9的某个排列),满足高n位能被n整除。例如abcdefghi,高两位ab能被2整除,高三位abc能被3整除,以此类推。一提到排列,很容易就想到递归+回溯,这个方法在面试中使用频率相当高。1~9这九个数字做一次全排列,符合条件的打印,不符合条件的返回。这里可以使用一些剪枝,例如第二高位只能是偶数,第四高位只能是偶数,原创 2014-09-06 21:34:47 · 1989 阅读 · 0 评论 -
大整数加法
#include #include #include #include #include #include #include #include using namespace std;string AddLongInteger(string addend, string augend){ int sum = 0; int carry = 0; int len1 = a原创 2014-09-19 20:13:49 · 1147 阅读 · 0 评论 -
用并查集求朋友圈数目
题目:假如已知有n个人和m对好友关系,如果两个人是直接或者间接有好友关系,则认为他们属于同一个朋友圈。写程序判断里面有多少朋友圈。例如:n = 5, m = 3 r = {(1,2), (2, 3), (4, 5)} 1 2 3 是一个朋友圈, 4 5 是一个朋友圈。所以输出是2原创 2014-08-22 10:50:06 · 2175 阅读 · 0 评论 -
字符串匹配 — BM算法
和Horspool不同的是,算法在失配时不光要看那个不配对的字符,而且还要看已经有多少个字符成功配对,把这两个信息相结合得出模式需要移动的距离。此算法在开始匹配之前需要建立两个表:坏符号移动表和好后缀移动表。坏符号移动表的求法和Horspool的求法一样,但好后缀移动表的计算就有一点复杂了。代码如下:效率分析:BM算法的最差效率是线性的,当字母表规模很大时,速度原创 2014-06-03 16:28:19 · 1426 阅读 · 0 评论 -
快速排序
实践中最快的已知排序算法。平均效率=O(NlogN)的递归算法。算法的思想是,先找出数列中的一个枢纽,然后在每次递归中,把小于枢纽的元素放枢纽左边,大于枢纽的元素放数组右边,即先做到“大概有序”,再切分数组,逐步递归达到全局有序。注意和归并排序的区别:快速排序先调整,后递归。归并排序先递归,后调整。小数组(N代码:#include原创 2014-06-14 15:13:32 · 860 阅读 · 0 评论 -
二叉查找树
一棵树是N个节点和N-1条边的集合。因为,每条边都将某个节点连接到它的父亲,而除去根节点外每一个节点都有一个父亲。二叉树:每个节点都不能有多于两个的儿子。深度平均值为O(logN)。使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。在程序中,一定要记得处理的根节点为空的情况。除了删原创 2014-04-29 15:51:18 · 967 阅读 · 0 评论 -
AVL树
一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。实际高度只比logN多以一点,和普通二叉查找树相比,平衡二叉搜索树一般而言搜寻时间可节省25%左右(STL源码剖析P203)。只有那些从插入点到根节点的路径上的节点的平衡可能被改变,因为只有这些节点的子树可能发生变化。把需要重新平衡的节点称为a(左右子树高度差大于1)。注意,确定这个节点很重要,否则无法确定原创 2014-05-04 17:06:10 · 1085 阅读 · 0 评论 -
栈的应用 — 中缀式转后缀式
由中缀式转换成后缀式,同样使用栈,并运用一些规则来完成。规则介绍如下:当读到的是操作数,立即输出。当读到的是运算符,则先从栈中弹出优先级高于自己的运算符(不包含括号),自己入栈。读到左括号入栈,读到右括号则将栈中元素出栈并输出,直到遇见左括号(括号都不输出)。输入为空后,将栈元素弹出并输出直到栈空。注意,最后生成的后缀表达式是考虑了运算符优先级的,再配合逆波兰的无优先级概念这一性质原创 2014-04-28 19:54:10 · 1074 阅读 · 0 评论 -
栈的应用 — 逆波兰记法
逆波兰记法又称为后缀记法,把操作符放置于操作数后面,计算过程通常用栈来实现的,通过栈来保存中间结果,使得逆波兰记法没有必要知道任何优先规则。方法描述:当见到一个数时就把它推入栈中;在遇到运算符时该运算符就作用于从该栈弹出的两个数上,将结果推入栈中。下面演示计算后缀表达式的过程。后缀表达式:6 5 2 3 + 8 * + 3 + *四个数字入栈:6 5 2 3(→栈生原创 2014-04-28 19:51:16 · 1020 阅读 · 0 评论 -
栈的应用 — 平衡符号
编译器可用此算法来检查括号是否成对出现,算法使用了一个栈。算法描述:做一个空栈。读入字符直到文件尾。如果字符是一个开放括号,则将其推入栈中。如果字符是一个封闭符号,则当栈空时报错。否则,将栈元素弹出。如果弹出的符号不是对应的开放符号,则报错。在文件尾,如果栈非空则报错。根据上面的描述,自己写了一份代码,它只能处理小、中、大三种括号:#include原创 2014-04-28 19:52:30 · 1521 阅读 · 0 评论 -
红黑树
红黑树是一个二叉搜索树,具有如下规则:每个节点不是红色就是黑色。根节点必须为黑色。如果节点为红,其子节点必须为黑,父子节点不得同时为红。任一节点至NULL(NULL为黑色)的任何路径,所含黑节点数必须相同。根据规则4,新增节点必须为红。根据规则3,新增节点的父节点必须为黑。因为新增节点必须是红,那么只有在父节点不为黑的时候才需要调整,父节点为黑则无需调整。着原创 2014-05-13 20:23:12 · 1023 阅读 · 0 评论 -
符串匹配 — Sunday
此算法比BM算法的效率还要高。Sunday算法没有规定必须从模式头部开始比较还是从模式尾部开始比较。所以两种方法都是可以的。下面是个例子,假设从头开始比较。文本:A B C A B D B C D模式:B C DA≠B,那么查看文本中越出比较范围后的第一个字符(这里为A)是否在模式中,如果在,则两者对齐,否则跳过A。这里直接跳过A。文本:A B C A B D原创 2014-06-04 16:17:55 · 1127 阅读 · 0 评论 -
插入排序
减治法思想,通过对较小已排序数组的扩充,得到整体有序。对于少量元素的排序,它是一个有效的算法。算法保证在对第j个元素进行排序时,前面的[0,...,j-1]已有序。效率:在最好情况下,待排序数组已有序,此时算法属于O(N)。在最坏情况下,待排序数组已反向排序,此时算法属于O(N^2),此时和比较排序的效率相同。如果输入基本有序,则该算法运行很快,这使它优于一些基本排序,例如原创 2014-05-21 21:14:41 · 769 阅读 · 0 评论 -
最大子序列和问题
算法1用两个for循环定位子序列的上下界,然后再用最内部的一个for循环求出上下界之间的元素和。时间复杂度:O(N³)。代码:int MaxSub(int *a, int n){ int sum = 0; int tmp; for (int i = 0; i < n; i++) { for (int j = i; j <原创 2014-05-25 16:55:22 · 1037 阅读 · 0 评论 -
动态规划 — 计算二项式系数
如果问题是由交叠的子问题所构成的,那么我们就可以用动态规划技术来解决它。也就是说,一个问题的解可由它的规模更小的子问题的解递推得出。由于子问题的交叠性质,所以采用递归地方法一次又一次地求解子问题时,进行了很多重复的工作。所以动态规划法建议:把子问题的解存入某个表中,通过表一步步反解出原始问题。斐波那契数列就是一个很好的例子:F(n) = F(n-1) + F(n-2) 当n≥2F(原创 2014-06-09 19:40:09 · 6386 阅读 · 0 评论 -
字符串匹配 — Horspool
蛮力法进行字符串匹配的缺点在于每次失配后模式只向后移动一个位置。想要提高算法效率,就必须在不错过文本中一个匹配子串风险的前提下,尽量增大模式向后移动的幅度。Horspool就是这样一种算法之一,它的思想要比KMP算法容易。它采用了输入增加技术:对模式进行预处理得到一些信息,把这些信息存储在表中,当文本和模式进行匹配时就会用到这些信息。Horspool的匹配过程是从右向左进行的,在匹配过程中会出现以原创 2014-05-28 17:20:14 · 1817 阅读 · 0 评论 -
计算字符串距离
编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。Levenshtein距离可以通过下面这个状态方程求解:这个式子还是比较好理解的:当字符串a为空,那么两个字符串之间的距离就是另一个字符串b的长度,因为可以通过删除strlen(b)个字符后编程空字符。其它三个方程原创 2014-09-15 14:50:46 · 2042 阅读 · 0 评论