算法与数据结构
狂奔的CD
这个作者很懒,什么都没留下…
展开
-
动态规划
文章目录前言正文什么是动态规划(Dynamic Programming)?1.基本内涵2.核心竞争力3.如何应用DP前言动态规划在基础算法中具有比较重要的地位,来看看它。正文什么是动态规划(Dynamic Programming)?刚入门的时候特别不容易理解。这里在知乎的问答中找到了一篇很容易入门的介绍,感谢这位大神https://www.zhihu.com/question/2399...原创 2020-01-10 13:33:49 · 122 阅读 · 0 评论 -
数据结构与算法之10(AVL自平衡二叉树与RB红黑树)
本节继续总结二叉树的变种,上节里的哈夫曼树是一种独特的二叉树,用于编解码会比较有效。这里的两种树都是BST二叉搜索树的加强版。》BST二叉搜索树的弱点我们之前也提到了,当插入序列是有序的时候,二叉搜索树几乎一边倒,像一个链表,这样查找的效率是低下的,接近O(N)。为了改善这一点,后来人考虑到算法效率低是因为它一边倒,太不平衡了,让它更平衡一点左右对称,查找的时候类似折半,就可以接近O(logN)了。原创 2017-12-01 16:13:45 · 461 阅读 · 0 评论 -
数据结构与算法之八(二叉树)
旁白:对于二叉树相信都已经非常熟悉了,这里不介绍基本概念。》为什么使用二叉树? 旁白:这个话题很犀利,我以前没注意到。书中做了如下解释: 我们前面聊的都是排序算法,见过数组和链表。有序数组通过二分查找可以将效率提升到O(logN),但是插入的时候需要移动很多元素,效率过低。而链表则正好相反,插入的时候效率很高,改一下节点指向就好,但是查找的时候只能顺藤摸瓜,效率很低。 使用二叉原创 2017-11-22 19:01:12 · 219 阅读 · 0 评论 -
数据结构与算法之七(划分算法与快速排序)
旁白:开始之前先回答一下上一节的问题,排序算法为什么要讨论是否稳定?也就是说相同关键字元素在前在后有什么区别吗? 网上有人举了一个栗子:假如发奖学金,排在前三个的有奖,结果一排序把原来在第三位的并列第三名给弄到第四位了,他估计不会乐意。 分析:实际上这个栗子不太准确,因为问题的产生是由于现实的需要,现实中估计需要并列第三名才能解决问题。也就是现实中存在这样的矛盾,有些时候的问题只原创 2017-10-31 12:10:23 · 429 阅读 · 0 评论 -
数据结构与算法之9(哈夫曼编解码与广度优先搜索)
》哈夫曼编码 在二叉树最后的例子里的最后提到了哈夫曼树,个人感觉不是很好理解,为大家找到了一个篇讲的比较简洁明了的http://blog.csdn.net/jinixin/article/details/52142352,就不再造轮子了,该篇文章是用c实现的,不过概念是一样的。 旁白:看完上面一篇之后,你得理解以下问题,哈夫曼编码为什么可以用来压缩数据?什么是最优前缀码?哈夫曼树的构造过程。原创 2017-11-27 18:09:52 · 827 阅读 · 0 评论 -
数据结构与算法之五(递归与递归消除)
递归是一种函数调用自身的手法。比如阶乘,可以如此实现:public long f(int n){ if(n==1) return 1; //停止调用 return n*f(n-1); //调用自身}》 上面也标出了递归两个特点。》 递归的效率:方法调用是有一定开销的,同时每次调用方法时需要将方法参数和这个方法的返回地址压入栈中,如果调用次数太多,需要大量内存空间存储,可能原创 2017-10-24 00:16:08 · 6712 阅读 · 0 评论 -
数据结构与算法之三(栈和队列的java实现)
栈栈在java中的实现方式是:public class Stack<E> extends Vector<E> Vector向量可以理解为高级的数组,因为它里面通过一个Object[]数组来维护所有元素,并且实现了该数组的管理以及动态增长。所以Stack本质上就是一个数组,通过继承Vector,同时提供Stack特性的几个方法push,pop,peek等,原理比较简单。队列》一般队列 队列的特点是先原创 2017-10-18 16:26:19 · 546 阅读 · 1 评论 -
数据结构与算法之六(希尔排序,非稳定排序)
旁白:这一节的内容消化起来没这么容易,那个pdf说的也比较复杂,建议大家在网上搜资料去看原理还容易一点。希尔排序1.介绍 还记得前面说的三种基本排序吗?插入排序可以说是性能较高的一种,但是如果完全逆序的插入排序,复制和移动效率依然低下。在此基础上有人提出了希尔排序,基于n-增量排序对插入排序进行优化。所谓n增量就是从原序列中选出间隔n的序列2.原理 对于序列序列9,8,7,6,原创 2017-10-30 17:12:43 · 469 阅读 · 0 评论 -
数据结构与算法之四(链表)
链表的概念在学c++的时候就接触了,就是一个个节点,每个节点里存在对下一个节点的引用。大概结构如下:class Node{ //节点的其他属性 ... //引用下一个节点 Node next;}这样一个个节点上一个连下一个就形成了链表,概念很简单。如果知道第一个节点的内存地址,那么可以顺藤摸瓜找到其他节点。这种存储方式的好处是插入和删除时不需要做移动操作,只要改一下原创 2017-10-20 02:31:13 · 228 阅读 · 0 评论 -
数据结构与算法之二(栈常见案例)
栈是一种常用数据结构,其特性是FILO(first in last out),其基本概念这里不做介绍,相信都学过了。直接食用java中已经封装好Stack<>类。栈的效率:入栈出栈复杂度为O(1),不需要比较和移动操作。案例1:单词逆序 比如,输入alphago,要求逆向输出其结果:ogahpla。可以用栈来解决这类问题。 String word = "alphago"; Stac原创 2017-02-07 18:56:09 · 2579 阅读 · 0 评论 -
数据结构与算法之一(三种简单排序)
重新整理数据结构与算法,之前的C版很不习惯,后来一段时间转java后台没怎么继续了。发现有一本Java数据结构和算法.(第二版),之后的内容按照这个来描述,程序都用java来写。跟高数一样也是立flag每日一更。今天简单点,三个简单排序,入门级算法,具体不实现了。1.冒泡排序第一趟 4,3,2,5,6 3,4,2,5,6 3,2,4,5,6第二趟 2,3,4,5,6结束复杂度分析: 对于长原创 2017-10-18 11:53:20 · 430 阅读 · 0 评论 -
算法回顾一(浮点数进制转换)
c语言基础部分跳过了,简单计算题也跳过了,重点关注一下数据结构和算法。另外,关于《程序设计导引及在线实践》里面的例子和练习貌似不是来自于poj,而是百练http://bailian.openjudge.cn/。openjudge是个好网站,还发现另一个好网站ACM之家http://www.acmerblog.com/category/basis/simulate。 所以接下来直接在百练提交就行。看原创 2016-11-01 14:10:57 · 1159 阅读 · 0 评论 -
算法回顾序(学习方法,第一个程序,《程序设计导引及在线实践》习题,移位运算)
作为一只想脱离低级趣味的猿,离不开数学和算法,可偏偏这些东西很难捡回来。以前可能是因为姿势不对,或是因为工作或是坚持不下去。现在找到了学习方式的我,再次尝试捡回他们,后面想想要不要把高数顺便捡回来。工欲善其事必先利其器,以前积累了很多资料结果硬盘坏了,再也找不到了,泪奔ing。不过算法刷题的地方还在那,就是北京poj:http://poj.org/。据说是几个学生搞出来了,实在是贡献太大了。然后发现原创 2016-10-26 19:27:41 · 1113 阅读 · 1 评论