算法与数据结构
C小虫
这个作者很懒,什么都没留下…
展开
-
算法设计读书笔记第二章
1.渐进界渐进上界:Big O T(n)=O(f(n)),存在常数c>0,以及n0>=0,当n>n0时,有T(n)渐进下界:Big Omega 与渐进上界相反渐进紧界:Big Theta 既是渐进上界也是渐进下界注:(1)表达式中,T(n)叫做被f(n)上界定。(2)对于log来说底数并不重要,都可以看做一种复杂度。原创 2015-05-07 21:39:34 · 1031 阅读 · 0 评论 -
LeetCode---1.ArrayEasy
1.题目思路1. 1.Two Sum关键词:hashMap思路:采用哈希表,将值作为key,将下标作为value,这样可以使用值的一些运算后在加去作为key查询。2. 26.Remove Duplicates from Sorted Array关键词:下标移动思路:采用一个下标,然后遍历数组,每出现一个不同的,就移动计数下标,并且存入。STL:本题,原创 2016-07-13 21:35:10 · 511 阅读 · 0 评论 -
LeetCode---2.StringEasy
1.题目思路1. 6.ZigZag Conversion关键词:构造规律思路:这个主要就是认识到,中间层是row-2,比如总的7行,中间就是5行。所以一个完整的循环是2*row-2个元素,然后分为第一,最后,中间来计算。需要记住的一点是,模块化不是代码的模块化而是逻辑的模块化。中间层(下标为1到row-1)的计算,维护两个指针,每次就添加并移动小的那个。原创 2016-07-15 20:36:03 · 477 阅读 · 0 评论 -
LeetCode---6.RestEasy
1.题目思路1. 292. Nim Game关键词:求余思路:这个根据两个人可以报的数,枚举所有情况发现。不管第一个人报什么,第二个人总能报到4.那么如果能被4整除,第二个人可确保赢。如果不能被4整除,第一个人将其余数报了,这样第一个人相当于能整除情况得第一个人,可确保赢。2. 371. Sum of Two Integers关键词:移位思路:分别计原创 2016-07-27 10:46:27 · 396 阅读 · 0 评论 -
LeetCode刷题总结
其实,刷这个题就是保持一个编程的状态,这个帖子是用来记录、总结自身通过leetcode刷题的感悟、技巧、方法的。1.ArrayEasy原创 2016-07-13 21:20:15 · 1018 阅读 · 0 评论 -
LeetCode---3.TreeEasy
1.题目思路1. 100.Same Tree关键词:值、结构思路:(1)采用递归。递归时先要搞清楚结束条件,本例有三个结束条件①两者都为NULL(值、结构相同)②一者为NULL,一者不为NULL(结构不同)③结构相同,val不同(值不同)(2)采用迭代这种可以使用递归的结构,要保证用迭代也能完全遍历地话,需要使用stack其他没什么特别的。2.原创 2016-07-17 20:36:35 · 282 阅读 · 0 评论 -
STL中的RB-tree
set和map的底层结构都是红黑树,它们最后基本只是对红黑树接口的简单调用。这里就主要来说一说红黑树。1.红黑树的定义红黑树首先是一棵二叉搜索树(BST),二叉的意思是每个节点最多有两个儿子,搜索的意思是根节点大于左儿子,小于右儿子。在此基础上还要满足以下5个条件:(1)只有红色和黑色2种节点(2)根节点为黑色(3)父子节点不能同时为红色(4)任意节点,到达其叶子节原创 2016-07-07 09:54:54 · 1222 阅读 · 0 评论 -
LeetCode---4.ListEasy
1.题目思路1. 19.Remove Nth Node From End of List关键词:双指针思路:注意题中条件已经说了,考虑的是n是valid,也就是说1实际上题目的答案在给出的时候,如果n>实际长度,应该得出等于n取size的结果。但是测试用例里面都没有大于实际长度的取值。(1)先遍历一次,计算链表实际长度,然后计算正向距离,然后再走到欲删除的节点进行删除原创 2016-07-20 09:28:26 · 364 阅读 · 0 评论 -
LeetCode---5.MathEasy
1.题目思路1. 7.Reverse Integer关键词:整数每位的获取思路:①取得符号,如果是负数转为正数方便处理。②一次取得每一位,恰好就再拼接就正好reverse了③特别注意溢出问题,因为这里的输入时int,所以用一个long来盛放,最后进行判断也可以。但是不用更大的数据类型时应该这样。if(result > INT_MAX / 10 || (resul原创 2016-07-21 11:56:47 · 420 阅读 · 0 评论 -
基于比较的排序算法的最优下界---NlogN
这个最优下界的意思就是说,这种算法最好的情况也至少需要这么多步骤才能排出来。进行非严格的推导。N个数,一共有N!种排列。比较i、j两个元素,最多能够确定多少种情况呢?是N!/2,仔细想想快速排序,如果选到了一个号元素可以减少一半,如果不是一个好元素,并不能减少这么多。所以这样推出来的是最优下界。那么我们设经过了k次比较,最后筛选出符合条件的唯一一种情况。(N!) / (2^原创 2016-07-21 15:31:52 · 3135 阅读 · 1 评论 -
理解KMP算法
KMP算法用于字符串的匹配。1.KMP的原理通常我们采用的方法是暴力匹配。时间复杂度为O(N*M)这里面可能有很多冗余操作。假设是在text字符串里面寻找pattern字符串。假设N为text长度,M为pattern长度。设N = 20, M = 8我们从text和pattern的第一位开始比较,比较了5位,然后发现第6位不同。如果是暴力解法,就会从text的第原创 2016-07-21 23:15:11 · 361 阅读 · 0 评论 -
C++中的trivial、standard layout、POD
在学习STL的时候,会反复出现trivial和POD这样的术语,这几个概念如果要特别仔细地区分,只能说是蛋疼。但是结合其在STL里面的用意,为了性能优化,不那么学究地去考究其意义还是相对好理解的。trivial是从其拷贝控制函数是否是系统合成的来说明的standard layout是从其内部布局是否类似于C中的struct来说明的POD(Plain Old Data)这里的Old就原创 2016-06-29 11:39:27 · 1612 阅读 · 0 评论 -
STL中的Sort
下面是对于STL中的sort进行一个小结,包含insert_sortbubble_sortquick_sortheap_sortmerge_sort几种1.stl_sort这个是STL算法里面的标准sort,因为关联容器如果用红黑树实现本身已经排好序,如果用哈希表实现排序会破坏其结构。在stl_sort实现中需要随机访问迭代器,所以不能用于list。而sta原创 2016-07-10 16:35:29 · 681 阅读 · 0 评论 -
Java中的hashMap
首先上个图key经过hash函数作用后得到一个槽(buckets或slots)的索引(index),槽中保存着我们想要获取的值本文讨论给出的部分源码,来源于Oracle JDK 1.7.0_71本文主要讲述hashMap的三个问题1.Object的hashCode方法和equals方法?2.hashMap如何设计好的方法,使得冲突尽可能少?3.h原创 2016-06-13 10:37:52 · 310 阅读 · 0 评论 -
Dijkstra算法的认识
Dijkstra算法步骤:1.初使时令 S={V0},T={其余顶点},T中顶点对应的距离值, 若存在,为弧上的权值,若不存在,为Inf。2.从T中选取一个其距离值为最小的顶点W加入S。对T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值比不加W的路径要短,则修改此距离值(此过程称为relax)。3.重复上述步骤,直到S中包含所有顶点,即S=V为止(说明最外层是除起点外原创 2015-06-01 16:18:22 · 1376 阅读 · 0 评论 -
图解Bellman-ford算法
原文地址:http://www.java3z.com/cwbwebhome/article/article1/1359.html?id=4720作者:cwb 一、Bellman-Ford算法: 为了能够求解边上带有负值的单源最短路径问题,Bellman(贝尔曼)和Ford(福特)提出了从源点逐次绕过其他顶点,以缩短到达终点的最短路径长度的方法。 Bellman-f转载 2015-06-01 21:02:30 · 5860 阅读 · 0 评论 -
几种最短路径算法的思考
1.单源与多源的区别(1)单源就是从一个点到所有其他点的最短路径,得到的结果是一个数组,表示某个点到其他点的最短距离。常用的算法有Dijkstra算法和Bellman-ford算法。(2)多源最短路径计算所有点到其他点的最短距离,得到的是一个矩阵。常用的算法有Floyd算法。摘自:http://zhidao.baidu.com/link?url=RlMQxzdCqmJRMp2原创 2015-06-01 20:21:27 · 447 阅读 · 0 评论 -
一些算法书籍
看了这个人的我的算法学习之路:http://lucida.me/blog/on-learning-algorithms/以及刘未鹏的几个帖子:http://mindhacks.cn/topics/algorithms/还有这个帖子:http://book.douban.com/review/1325850/总结了几本算法学习的比较好的书:1.《算法 4th》 Robert原创 2015-12-08 20:20:38 · 941 阅读 · 0 评论 -
自己指定的学习路线
目前迷恋的语言就是C++和Scheme/Racket,所以路线主要分成3个,这两种语言再加上一个算法与数据结构方面的。打钩表示我正在看的。1.C++主要通过以下4本书①C++ Primer ,5th②The C++ Standard Library ,2nd ✔③Inside The C++ Object Model④The Design and Evolu原创 2015-12-21 13:50:04 · 395 阅读 · 0 评论 -
算法设计---优先队列与索引优先队列
1.优先队列2.索引优先队列(1)预备知识①索引英文的表达式Index,索引优先队列就是在优先队列的基础上提供一个通过索引访问队列中元素的方式。而一般的实现方式就是将插入队列中的顺序作为索引,通过索引可以找到元素在堆中的下标,再用这个下标就能访问到元素啦。②平行数组加入说有一种对象,它有3个属性,现在有N个这种对象。A。你可以使用一个类的实例,或者一个结构体来表示这原创 2016-03-03 10:38:46 · 2009 阅读 · 0 评论 -
键值对与键=值
1.符号表(ST)就是存放键值对的数据结构。可以采用平行数组来实现,Key [] keys; Value[] vals;2.直觉上的违反最开始处理的情况是没有键-值的情况,所有的处理情况就是处理的值。比如在一个有序的数组中,使用二分查找找到某一个数的下标。我们直接通过值来搜索,而这个值就是元素的标识。现在我们来做一个区分,使用key专门来区分不同的对象,而val原创 2016-03-03 16:03:20 · 9577 阅读 · 0 评论 -
链表相交问题
来说说链表相交问题。假设有链表L1和L2,长度分别为N1,N21.相交判断(1)遍历L1,对每一个节点的地址,建立哈希set,然后遍历L2,判断L2节点在不在哈希set中。时间复杂度:o(N1 + N2/2)空间复杂度:o(N1)优点:可以顺便定位交点。缺点:需要空间复杂度。(2)都找到最后一个节点,然后判断最后一个节点是否一样即可。如果维护一个尾节点的变量的话原创 2016-04-01 21:30:46 · 289 阅读 · 0 评论 -
排序算法思想
本文总结目前我接触的几种排序算法,不设计具体的代码,只是写下我理解的它们在做什么1.排序思想(1)选择排序每次通过逐一比较,找出一个最值(2)冒泡排序每次通过相邻元素的逐一比较,沉底一个最大元素,或者冒泡一个最小元素。(3)插入排序每次通过比较维护一个已排好序的子序列,当这个子序列长度与原序列相等时就排好序了。(4)归并排序merge是核心,merge通过移动下原创 2016-03-03 14:50:19 · 388 阅读 · 0 评论 -
STL中的Iterator
话不多说,就是总结几个问题1.什么是迭代器(1)迭代器可以看做一种智能指针,他会重载*和->运算符。(2)但是它并不一定具备指针的所有运算符:p++,p--,p+n,p-n,p[n],p1-p2,p1有可能它只提供一部分,比如:p++,p--,p1!=p2(3)STL强数据容器与算法分开,而迭代器又作为胶着剂将其撮合在一起。2.为什么每一种容器都要开发其专属迭代器(1)原创 2016-06-19 21:30:05 · 1114 阅读 · 0 评论 -
排序算法的稳定性
今天专门来讲一下排序算法的稳定性。1.稳定性的含义这个稳定性的意思就是说,在排序过程中,具有相同数值的对象的相对顺序被不被打乱。如果可以保证不被打乱就是稳定的,如果不能保证就是不稳定的。2.稳定性的作用因为有可能一个值又多重属性,我们需要对其各个属性分别排序。如果在对某一种属性排序的过程中能够保持稳定性的话,对其他属性的处理就很有帮助。3.具体算法的稳定性稳定:插入原创 2016-08-02 15:20:42 · 807 阅读 · 0 评论