算法
文章平均质量分 68
炫辰0927
这个作者很懒,什么都没留下…
展开
-
计数排序
转载于:http://blog.csdn.net/llzk_/article/details/53354071排序总归来说可分为两大类,比较排序与非比较排序。比较排序就是我们常用到的冒泡排序,插入排序,希尔排序,选择排序,堆排序,快速排序,归并排序。非比较排序不常用,但是在对一些特殊的情况进行处理时,它的速度反而更快。1、计数排序 排序原理:利用哈希的方法,将每个数据出现的次数都统计下来。哈希表...转载 2018-03-07 10:54:57 · 175 阅读 · 0 评论 -
KMP算法
给定目标字符串S,和模板字符串T,求S中是否包含T?T在S中的起始位置是多少?KMP的核心思想就是利用已有的匹配信息减少不必要的比较,当发生失配时候,i保持不动,j回溯到next【j】的位置,从而达到O(n)的复杂度来解决原本O(nm)复杂度的问题。(其中n是S串的长度,m是T串的长度。)前提知识:例如,”Harry”的前缀包括{”H”, ”Ha”, ”Har”, ”Harr”},”P...转载 2018-06-01 14:40:40 · 243 阅读 · 0 评论 -
剑指offer(链表的算法题)
本文包含链表的以下内容: 1、查找单链表中的倒数第k个结点(剑指offer,题15) 2、合并两个有序的单链表,合并之后的链表依然有序【出现频率高】(剑指offer,题17) 3、单链表的反转【出现频率最高】(剑指offer,题16) 4、从尾到头打印单链表(剑指offer,题5) 5、单链表中,取出环的起始点(剑指offer,题56) 6、判断两个单链表相交的...原创 2018-05-18 20:23:44 · 951 阅读 · 0 评论 -
剑指Offer(33 把数组排成最小数 ,34 丑数,40 数组中只出现一次的数字)
33.把数组排成最小数问题描述:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。 思路:先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可。这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与 ba。如果ab ...转载 2018-04-23 17:03:36 · 221 阅读 · 0 评论 -
大数据处理(位图,布隆过滤器)
位图法位图的基本概念是用一个位(bit)来标记某个数据的存放状态。海量数据排序 从最简单的情况说起,如果要对90个小于100的不重复的正整数排序。用位图的思想就是先申请一块100bit的空间,第一遍遍历所有的数,将出现的数字在位图中对应的位置置为1;第二遍遍历位图,依次输出值为1的位对应的数字。先且不说这种情况出现的频率不是很高,就仅这种情况,还是有很多其他的排序算法有它们自己的优势(不用额外...转载 2018-04-22 21:08:47 · 430 阅读 · 0 评论 -
大小堆以及TOP K问题
完全二叉树如上图所示,我们可以将完全二叉树的结点按照层序遍历的顺序储存在一个数组中,那么当完全二叉树中的某个结点位于array的i处时,其左子节点必位于2i+1处(i>=0),其右结点必位于array的2i+2处。这样我们就可以轻易的实现完全二叉树的存储。一般调整大小堆,从第一个非叶子节点位置开始,在数组中位size/2-1处,如上所示就是E。若将结点v的编号(秩)记作i(v...原创 2018-04-11 19:40:12 · 903 阅读 · 1 评论 -
字典树问题与AC自动机
Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。字典树的核心就是空间换时间,空间消耗大,但是插入和查询有着很优秀的时间复杂度,利用字符串的公共前缀来避免无谓的字符串比较,降低查询时间。 Trie树的平均高度h为单词平均长度len,所以Trie树的查询复杂度为O(h)=O(len)字典树节点: ...转载 2018-04-10 18:50:51 · 752 阅读 · 0 评论 -
动态规划0-1背包问题
简单引入:有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。动态规划中的三个概念:最优子结构,边界,状态转移公式;F(1)=1;F(2)=2;F(n)=F(n-1)+F(n-2) (n>=3);例如:F(10)=F(8)+F(9)为最优子结构;F(1)=1,F(2)=2为边界;F(n)=F(n-1)+F(n-2) (n>=3)...转载 2018-04-07 16:35:07 · 457 阅读 · 0 评论 -
mid的计算方法
如果用mid=(low+high)/2,在运行二分查找程序时可能超时。原因是int类型最大表示范围是2147483647,如果输入的low和high都接近2147483647,两个数相加就会溢出,变成一个负数。所以如果想避免溢出,不能使用mid=(low+high)/2,应该使用mid=low+(high-low)/2。因为mid=(low + high)/2=(low + low + high ...转载 2018-03-04 09:57:22 · 2551 阅读 · 0 评论 -
快速排序
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个元素要O(nlogn)次比较。在最坏状况下则需要O(n^2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他O(nlogn)算法更快,因为它的内部循环可以在大部分的架构上很有效率地被实现出来。 每经过一趟快排,轴点元素都必然就位,也就是说,一趟下来至少有1个元素在其最终位置 快速排序使用分治策略...转载 2018-03-03 17:05:05 · 299 阅读 · 0 评论 -
归并排序
https://www.cnblogs.com/eniac12/p/5329396.html 归并排序是创建在归并操作上的一种有效的排序算法,效率为O(nlogn),1945年由冯·诺伊曼首次提出。 归并排序的实现分为递归实现与非递归(迭代)实现。递归实现的归并排序是算法设计中分治策略的典型应用,我们将一个大问题分割成小问题分别解决,然后用所有小问题的答案来解决整个大问题。非递归(迭...转载 2018-03-03 14:54:36 · 195 阅读 · 0 评论 -
插入排序之希尔排序
void InsertionSort(int A[],int n) //直接插入排序{ for(int i=1;i<n;i++) //从头部第一个当做已经排好序的,把后面的一个一个的插到已经排好的列表中去。 { int get = A[i]; // 右手抓到一张扑克牌 int j = i - 1; ...转载 2018-03-01 18:26:36 · 151 阅读 · 0 评论 -
插入排序
直接插入排序 (时间复杂度为O(N^2))介绍:插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 方式一步...转载 2018-02-28 21:01:34 · 241 阅读 · 0 评论 -
选择排序
选择排序也是一种简单直观的排序算法。它的工作原理很容易理解:初始时在序列中找到最小(大)元素,放到序列的起始位置作为已排序序列;然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 注意选择排序与冒泡排序的区别:冒泡排序通过依次交换相邻两个顺序不合法的元素位置,从而将当前最小(大)元素放到合适的位置;而选择排序每遍历一次都记住了当前最小(...转载 2018-02-28 20:31:20 · 30799 阅读 · 3 评论 -
冒泡排序
1、比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数。3、针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序)。4、持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序。void bubble_sort(int arr[], int...转载 2018-02-28 19:34:59 · 114657 阅读 · 11 评论 -
排序算法
0.1 排序的定义对一序列对象根据某个关键字进行排序。0.2 术语说明稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个算法执行所耗费的时间。 空间...转载 2018-02-28 19:30:31 · 305 阅读 · 0 评论 -
哈希表简介
转载于:http://blog.csdn.net/u013752202/article/details/51104156顺序查表法假设现在有1000个人的档案资料需要存放进档案柜子里。要求是能够快速查询到某人档案是否已经存档,如果已经存档则能快速调出档案。如果是你,你会怎么做?最普通的做法就是把每个人的档案依次放到柜子里,然后柜子外面贴上人名,需要查询某个人的档案的时候就根据这个人的姓名来确定是否...转载 2018-03-08 15:31:55 · 196 阅读 · 0 评论 -
手撕代码题
考题1:二分查找(递归与非递归)//递归方法int BinSearch(int Array[],int low,int high,int key/*要找的值*/) { if (low<=high) { int mid = (low+high)/2; if(key == Array[mid]) ...转载 2018-07-27 11:20:35 · 1331 阅读 · 0 评论