
每日算法
文章平均质量分 70
每天学一点点算法,每天进步一点点。
jiange_zh
linux 网络编程 C++ 算法 数据结构
展开
-
【每日算法】图算法(遍历&MST&最短路径&拓扑排序)
图有邻接矩阵和邻接表两种存储方法,邻接矩阵很简单,这里不讨论,下面我们先看看常用的邻接表表示方法。邻接表常用表示方法指针表示法指针表示法一共需要两个结构体:struct ArcNode //定义边表结点 { int adjvex; //邻接点域 ArcNode* next;};struct VertexNode //定义顶点表结点{ int原创 2016-02-28 21:04:49 · 7969 阅读 · 0 评论 -
【每日算法】哈希表(Hash Table)
概述哈希表又称散列表,它用于快速查找。查找,如果能够不经过比较,直接就能得到待查记录的存储位置,那效率必定很高。通过在记录的存储位置和它的关键码之间建立一个确定的对应关系H,使得每个关键码key跟唯一的存储位置H(key)对应,那么当我们想查找关键码为k的记录时,直接到H(k)处取即可。这种查找技术叫做散列技术。采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表,将关键码映射原创 2016-02-25 23:16:42 · 2748 阅读 · 0 评论 -
【每日算法】二叉树的遍历
二叉树特点每个节点最多有两棵子树;二叉树是有序的,即区分左右子树的次序。完全二叉树叶子节点只能出现在最下两层,且最下层的叶子节点都集中在二叉树左侧连续的位置。如果有度为1的节点,只可能有一个,且该节点只有左孩子。二叉树实现这里只讲二叉链表实现,使用C++。templateclass DataType>struct BiNode{ DataTy原创 2016-02-25 00:17:25 · 3611 阅读 · 0 评论 -
【每日算法】链表 & 例题选讲
单链表链表是常用的数据结构,其优点是插入和删除元素时不需要移动,表的容量可扩充,且存储空间可以不连续。另外,由于涉及到指针,所以很受面试官的青睐。本文将主要介绍单链表,并简单介绍下双链表和环形链表,并通过一系列的题目来强化这方面的知识。链表节点的结构:templateclass DataType>struct Node{ DataType data; N原创 2016-02-24 14:55:17 · 2512 阅读 · 3 评论 -
【每日算法】栈&队列
栈和队列栈:后进先出(last-in, first-out, LIFO)队列:先进先出(first-in, first-out, FIFO)栈的实现栈的实现有多种方法,比如静态数组、动态数组以及链表。下面我们先简单介绍一下静态数组的实现方法:我们可以用一个数组s[0…n-1]来实现一个至多有n个元素的栈,使用top来表示栈顶元素的下标,当top = -1时栈为空,当top = n-1时栈满。int原创 2016-02-22 18:10:25 · 2745 阅读 · 1 评论 -
【每日算法】排序算法总结(复杂度&稳定性)
一、插入排序:稳定,时间复杂度O(n^2)想象你在打扑克牌,一开始左手是空的,接着右手开始从桌上摸牌,并将其插入到左手的一把牌中的正确位置上。为了找到这个正确位置,我们需要从右到左将它与手中的牌比较,直到找到合适的位置插入。整个过程的特点是,左手的牌是排好序的了。详见: 插入排序二、选择排序:不稳定,时间复杂度O(n^2)每趟从未排序部分选出最小的元素,然后通过交换将其添加到已排序部分中。详见:原创 2016-02-20 16:12:19 · 3124 阅读 · 1 评论 -
RSA算法原理
历史1976年以前,所有的加密方法都是同一种模式:(1)甲方选择某一种加密规则,对信息进行加密;(2)乙方使用同一种规则,对信息进行解密。由于加密和解密使用同样规则(简称”密钥”),这被称为”对称加密算法”(Symmetric-key algorithm)。这种加密模式有一个最大弱点:甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。1976年,两位美国计算机学家Whi原创 2015-10-22 21:33:13 · 2847 阅读 · 0 评论 -
【并行计算】Bitonic Sort(双调排序)基础
双调序列双调序列(Bitonic Sequence)是指由一个非严格增序列X和非严格减序列Y构成的序列,比如序列(23,10,8,3,5,7,11,78)。定义:一个序列a1,a2,…,an是双调序列(Bitonic Sequence),如果: (1)存在一个ak(1≤k≤n), 使得a1≥…≥ak≤…≤an成立;或者 (2)序列能够循环移位满足条件(1)Batcher定理将任意一个长为2n的双原创 2015-10-31 16:22:28 · 17923 阅读 · 2 评论 -
【每日算法】计数&基数&桶&位图排序-简介
在前面的文章中,我们介绍的都是基于比较的排序。对于比较排序,对含n个元素的序列进行排序,在最坏情况下都要用O(n logn)次比较(归并排序和堆排序是渐近最优的)。本文将继续介绍以线性时间运行的排序算法,他们使用的是非比较排序,因此下界O(n logn)对它们不适用。计数排序想象下面这种情况:一个班有k个人,需要排成一条纵队,地面上已经用粉笔按从小到大的顺序标明了1到k个号码,要求按身高从低到高排列原创 2016-02-20 12:48:55 · 2274 阅读 · 0 评论 -
【编程珠玑-读书笔记】用位图解决排序问题--仔细分析问题的重要性
开始读《编程珠玑》,刚看完开篇就觉得很开心。作者从“A Friendly Conversation”讲起,大概是这样子的:一个programmer问作者:“How do I sort a disk file?”于是作者简要介绍了一下如何在磁盘中实现Merge Sort,并建议他先钻研下算法课本。然而programmer关注的是如何解决问题,而不是进一步学习。流行的磁盘排序程序大约10多个函数,200原创 2015-10-28 20:42:29 · 1412 阅读 · 0 评论 -
【每日算法】堆排序&优先队列
堆排序(heapsort)的运行时间为O(n logn),是一种原地排序算法,是不稳定的排序算法。堆基本介绍先直观感受一下,下面就是一个堆:16 7 3 20 17 8什么??上面不就一个数组吗……?!没错,(二叉)堆数据结构是一种数组对象。不过,让我们用另外一种方式来看这个数组:对于表示堆的数组arr[1…n],我们以arr[1]为根,给定某个节点下标i,令其父节点和左右后代节点的下标为:pare原创 2016-02-19 23:42:41 · 5050 阅读 · 4 评论 -
【每日算法】归并排序及其应用(逆序对&合并有序链表)
归并排序是建立在归并操作上的排序算法,是采用分治法(Divide and Conquer)的一个非常典型的应用,它常用来做外排序。若将两个有序表合并成一个有序表,称为二路归并。外排序外排序(External sorting)是指能够处理极大量数据的排序算法。通常来说,外排序处理的数据不能一次装入内存,只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采用的是一种“排序-归并”的策略。在排序阶段,原创 2016-02-19 19:10:36 · 2840 阅读 · 0 评论 -
【每日算法】插入&选择&冒泡排序
在正式讲排序算法之前,我们先看一个概念:排序算法的稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。插入排序这是一个对【少量元素】进行排序的有效算法。思想:想象你在打扑克牌,原创 2016-02-18 23:50:43 · 4420 阅读 · 3 评论 -
【每日算法】快速排序及其应用
快速排序快排的最坏运行时间为O(n^2),平均运行时间为O(n logn),且隐含的常数因子很小,能够进行就地排序。快排基于分治模式,其基本思想:分解:从序列中取出一个数作为基准数,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边,从而得到两个子序列。解决:递归调用快速排序,对两个子序列进行排序。合并:因为子序列是就地排序的,所以合并不需要任何操作。伪代码:quickSort(arr,原创 2016-02-18 15:55:47 · 6837 阅读 · 1 评论 -
【每日算法】快速幂
数值的整数次方实现函数double Power(double base, int n) 求base的n次方,不得使用库函数,同时不需要考虑大数问题。Tips问题本身很直观,但是越简单的题越需要细心思考,包括边界问题和效率问题,如果不能考虑到以下3点,就无法给出令人满意的答案:考虑n为负数的情况;考虑base为0的情况;当n较大时,如何保证效率?分析针对上面3个问题,我们逐一解答:1.在计算原创 2016-02-18 11:50:53 · 6364 阅读 · 1 评论 -
【每日算法】洗牌算法
洗牌算法给定一个n个数的序列,设计一个算法将其随机打乱,保证每个数出现在任意一个位置的概率相同(也就是说在n!个的排列中,每一个排列出现的概率相同)。原创 2016-02-18 10:27:19 · 2794 阅读 · 0 评论 -
【每日算法】开篇&二分查找
开篇算法是神奇的。IT技术日新月异,各种语言、工具、平台快速更迭着。而算法、数据结构,几乎是不会过时的。之前学习了算法与数据结构,但是总感觉没有用武之地,对算法的认识大多仅限于”程序设计大赛”。因为不常用,所以渐渐生疏。前阵子在学习lighttpd的源码,发现里面的算法、数据结构几乎贯穿了整个项目,数组、字符串、链表、树等数据结构以及二分查找等算法的灵活应用,使得整个项目的逻辑原创 2016-02-18 10:24:36 · 2835 阅读 · 1 评论 -
使用两个队列实现一个栈
队列是先进先出,而栈是先进后出;考虑到我们取栈顶元素的便利性,我们在实现时使得栈顶等于队列头;由于栈的pop弹出栈顶元素,而队列的pop也是弹出栈顶元素,所以我们需要特别处理的是插入操作。由于往栈中添加元素相当于往队列头添加元素,因此我们需要在两个队列中进行元素的转移,比较简单的实现是:1.q1和q2在任一时刻至少有一个为空,即如果有元素,所以元素只在同一个队列中。 2.当有元素需要插入时,将插入原创 2016-01-25 21:56:15 · 10767 阅读 · 0 评论 -
使用两个栈实现一个队列
实现1s1:用于入栈; s2:出栈时用于辅助;入队列:直接压入s1中; 出队列:将s1的元素倒入s2中,s2弹出栈顶元素,再把元素倒回s1中;实现2s1:用于入栈; s2:用于出栈。 所有元素都在同一个栈里面。入队列:如果s1为空,把s2中所有的元素倒到s1中,再把元素压入s1;否则直接压入s1; 出队列:如果s2为空,把s1的所有元素全部倒到s2中,再弹出s2的栈顶元素;否则,直接把s2原创 2016-01-21 17:50:31 · 890 阅读 · 1 评论 -
【随机算法】Miller-Rabin大素数检测算法(蒙特卡罗方法)
费马小定理 假如p是质数,且(a,p)=1,那么 a^(p-1)≡1(mod p)。 即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。算法1 事实上,质数一定满足以上条件,但是满足以上条件的不一定是质数。 但是我们还是先利用这个性质来判断一个数N是否为素数。首先我们看一下算法1:bool prime(int n){ 随原创 2015-10-26 21:23:33 · 4399 阅读 · 0 评论 -
【随机算法】蒙特▪卡罗方法初识
随机算法随机算法分为两类:蒙特卡罗和拉斯维加斯蒙特卡罗指的是算法的时间复杂度固定,然而结果有一定几率失败;拉斯维加斯指的是算法一定成功,然而运行时间是概率的;蒙特卡罗方法蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数原创 2015-10-26 19:58:52 · 2051 阅读 · 0 评论 -
【算法设计与数据结构】欧几里得算法、拓展欧几里得算法
欧几里得算法求最大公约数//递归版本int gcd (int a, int b){ if (b == 0) return a; else return gcd(b, a%b);}//非递归版本//辗转相除法while (m % n){ int tmp = m; m = n; n = tmp % n;}return原创 2015-10-22 00:07:33 · 947 阅读 · 0 评论 -
【算法设计与数据结构】三分法:求单峰函数的极值
介绍三分法的思路与二分法很类似,不过其用途没有那么广泛,主要用于求单峰函数的极值。示例代码void Solve(){ double left, right, m1, m2, m1_value, m2_value; left = MIN; right = MAX; while (left + EPS < right) { m1 = left +原创 2015-10-21 23:18:12 · 2808 阅读 · 0 评论 -
【算法设计与数据结构】二分法解决最大值最小化问题—进阶篇— URAL 2034 Caravans
题目大意一辆卡车从起点s到终点f,走的是最短路径。强盗从r出发前往卡车途经的某个点拦截,同样,强盗选择最近的点。卡车走的最短路径可能有多条,求最坏情况下强盗花费的时间。简而言之,两个步骤: 1)求r点到(所有s到t的)最短路的最短距离; 2)在这些最短距离中找最大值原创 2015-09-04 00:00:41 · 1491 阅读 · 1 评论 -
【算法设计与数据结构】二分法解决最大值最小化问题——入门篇
问题描述把一个包含n个正整数的序列划分成m个连续的子序列。设第i个序列的各数之和为S(i),求所有S(i)的最大值最小是多少?例子: 序列1 2 3 2 5 4划分为3个子序列的最优方案为 1 2 3 | 2 5 | 4,其中S(1),S(2),S(3)分别为6,7,4,那么最大值为7; 如果划分为 1 2 | 3 2 | 5 4,则最大值为9,不是最小。原创 2015-09-03 13:54:20 · 6971 阅读 · 3 评论 -
【算法设计与数据结构】匈牙利算法求最大匹配
简介 设G=(V,E)是一个无向图。如顶点集V可分割为两个互不相交的子集V1,V2,选择这样的子集中边数最大的子集称为图的最大匹配问题(maximal matching problem) 如果一个匹配中,|V1|<=|V2|且匹配数|M|=|V1|则称此匹配为完全匹配,也称作完备匹配。特别的当|V1|=|V2|称为完美匹配。原创 2015-09-03 08:29:49 · 4302 阅读 · 0 评论 -
【算法设计与数据结构】拓扑排序算法的实现——Kahn算法及基于dfs的算法
拓扑排序的定义和原理等我不再赘述,各种教材和网络上都有详细解释,今天我主要谈一谈两种实现拓扑排序的算法——Kahn算法和基于dfs的算法原创 2015-09-02 20:29:49 · 4941 阅读 · 1 评论