数据结构
xingsh123
这个作者很懒,什么都没留下…
展开
-
详解KMP算法
普通的匹配算法在最坏的情况下的效率很低,如:‘00001’,主串:‘00000000000000001’,则时间复杂度为O(n*m ). kmp算法不需要回溯指针,KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。 简单来说,模式串中的某个字符匹配失败了,返回下一个要查找的字符,看个例子:模式串:‘abcabd’,主串:‘cabcabcabd’,原创 2017-09-05 11:14:11 · 236 阅读 · 0 评论 -
如何判断单链表是否有环
这个是一个比较有意思的问题,我最开始想到方法是指定一个指针依次向后移动在与前面的每个节点依次比较,但是这个算法时间复杂度为O(n)效率很低,肯定不行。又想了一个效率比较高的算法,基本思想就是定义两个指针,让他们互相追赶,可以想象成两个人,前面一个人比后面一个人速度快,如果链表没有环,那么前面一个人就不会和另一个人相遇,但如果有环,就相当于两个人在操场上跑步,因为两个人速度不一样,所以两人最终一定会原创 2017-09-13 12:57:51 · 300 阅读 · 0 评论 -
最小生成树
给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树. 求最小生成树的算法 (1) 克鲁斯卡尔算法 图的存贮结构采用边集数组,且权值相等的边在数组中排列次序可以是任意的.该方法对于边相对比较多的不是很实用,浪费时间. (2) 普里姆算法 图的存贮结构采用邻接矩阵.此方法是按各个顶点连通的步骤进行,需要用一个顶点集合,开始为空集,以后将以连通的顶点陆续转载 2017-09-13 16:19:59 · 207 阅读 · 0 评论 -
最大子数组问题
在leetcode上看到的求最大子数组问题,在算法导论上分治策略章节中也有相同的问题,在这里介绍两种算法。 第一种,用分治法的思想去求解,先将数组对半分,那么,最大子数组的位置有三种情况,1.子数组全部在中点的右边,2.子数组全部在中点的左边。3.子数组部分在中点的左边,另一部分在中点的右边。 只要分别求出这三种情况的最大值比较,取最大的即为最大子数组。 第三种情况最简单只要从中点出发,向左递原创 2017-11-05 16:48:32 · 1696 阅读 · 0 评论 -
Symmetric Tree
leetcode上的一道题,原题如下: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).For example, this binary tree [1,2,2,3,4,4,3] is symmetric:1 / \ 2 2 / \ /原创 2017-11-15 21:30:36 · 171 阅读 · 0 评论