![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
Somhu
biu...biu...biu...
展开
-
java实现斐波那契数列
斐波那契这个老家伙率先发现了这个有意思的数列:即1、1、2、3、5、8、13、21……不难发现这个数列具有一种规律:从第三个数开始,其值等于前两个数字之和。同样有意思的是,有个看似很接地气儿的生活中的小例子可以来诠释这个数列的真谛,其实应该是这个数列诠释这个例子的“真谛”。 话说:兔子出生两个月后就具备无限繁殖能力,一对兔子每个月能生一对小兔子。现有刚出生的一对小兔子,一年后共有多少对? 直接搞原创 2017-08-31 11:24:24 · 438 阅读 · 0 评论 -
java集合—结合要点解析源码
关系图: 可以根据下述关键点自行源码剖析。ArrayList要点:初始化(数组一但在堆内存中创建,长度是固定的): 不指定初始化数组长度(public ArrayList(){...}):底层默认在jvm内存中开辟长度为10的数组 指定初始化数组长度(public ArrayList(int initialCapacity){...}):开辟指定长度的数组数组扩容原创 2017-11-30 11:19:22 · 272 阅读 · 0 评论 -
排序(一):冒泡排序
首先引入一个例子:假如班级考试成绩排名,首先根据总成绩确定名次。那如果总成绩有相同的情况,那么再按照数语外三科成绩之和进行排名,如此以来我们需要比对两次。那么我们可以考虑,把这两个关键字(总成绩、数语外三科成绩)的值拼接在一起,位数不够的补零,这样以来就能直接比较出个优劣来。比如:两个同学的总成绩都是456,但是数语外三科成绩和分别为230和198,拼接起来就是456230和456198,然后原创 2017-09-21 14:51:15 · 629 阅读 · 0 评论 -
排序(四):希尔排序
前边的三次讨论的排序算法的时间复杂度都为O(n2),那么有没有时间复杂度更小的算法呢?答案是肯定的。在第一篇冒泡排序算法中介绍过,冒泡、选择、插入算法方案都是简单算法,之所以被列为“简单”的行列原因大致是时间复杂度大于还是小于O(n2)。下边将继续介绍第一种时间复杂度优于O(n2)的算法:希尔排序。下面来简要介绍一下希尔排序实现有序序列生成的基本思想:通过进行有限次的循环,每次循环后会生成原创 2017-09-22 10:24:18 · 648 阅读 · 0 评论 -
排序(三):插入排序
前边分别讨论了冒泡排序和选择排序,并分析了二者时间复杂度及性能优劣。这里继续介绍另一种排序算法:直接插入排序。这是一种比前二者性能都要好些的排序方法。所谓插入排序,由字面上不难猜出就是把相对较小(从小到大排序)的元素插入到数组中准确的位置实现有序数组的生成。定义:直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的原创 2017-09-21 23:43:33 · 218 阅读 · 0 评论 -
有序表查询之四:查询实现总结
对于折半查找与插值查找,二者孰优孰劣,已经在该有序表查询的系列一种进行了阐述,二者可谓打个平手不分伯仲。在回到斐波那契与折半查找二者身上,平均来说,斐波那契由于折半,但是必须考虑极端情况,也就是当要查找的值为数组下标起始或者结束位置时,斐波那契反而略输折半一筹,这也是能预见的结果。那么对于这三者孰优孰劣的比较的说法措辞可谓仁者见仁智者见智你说你有理我说我有据了。但有一点,归根结底还是要回归原创 2017-09-12 18:49:04 · 392 阅读 · 0 评论 -
有序表查询之一:java实现整型数组二分查找
引言:要从杂乱无章随意堆放的物品中找到目标可能不是一件容易的事,但是有规律可循的实物中,我们总是能通过一定的手段快速“悠闲地”找到我们想要的东西。比如从一本字典中可以快速查找到我们要查询的汉字或者单词。这里就引申出来一种有序性。这种有序性可以是按照数字方式由大到小、由小到大,或者可以按照字母、拼音的排列方式。在数据结构中的二叉树中,不难见识到所谓的折半查找(也叫作二分查找法原创 2017-09-11 18:34:48 · 750 阅读 · 0 评论 -
有序表查询之二:java实现插值查询
插值查询是以二分查询优化方案的身份存在的。从字(词)典查找“阿”或者“zip”,相信不会有人会从正中间开始查吧,而是直接翻到接近这个词在字典中的大致页数。比如在一个有序的从小到大并且数值均匀分布的数组中查询一个接近数组最大边界处的比较大数的数时,我们首先想到就是从数组下标大的大方开始查询。所以这就是插值查询方式出现的理由。借鉴上篇博对二分查找的介绍:有序表查原创 2017-09-12 15:33:17 · 497 阅读 · 0 评论 -
红黑树(RBT)和平衡二叉树(AVL)
二者都二叉排序树的一种(关于二叉排序树的特征这里不再赘述)。AVL是严格高度平衡的二叉排序树(平衡二叉树。由前苏联的数学家Adelse-Velskil和Landis在1962年提出的高度平衡的二叉树,根据科学家的英文名也称为AVL树)RBT是非严格平衡的二叉平衡树下面来阐述一下AVL和RBT各自具有的特性:AVL:可以是空树假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树任何一个原创 2017-09-20 15:27:14 · 728 阅读 · 0 评论 -
有序表查询之三:java实现斐波那契查询
前边分别介绍了有序表的前两种查找方式二分查找和插值查找,这里再对其另一种方式进行java实现:斐波那契查询。直接上代码,其中数组扩容和将不满的数值补全是为了防止下标越界异常,当查询的数是有序数组中最后一个值时,在第二个实现查找功能的while循环中的第二次循环时就会发现数组越界,所以这里进行“补偿”。public class FabnacciSearch { private st原创 2017-09-12 15:10:30 · 255 阅读 · 0 评论 -
排序(六):归并排序
【摘自《大话数据结构》】原创 2017-09-26 19:19:38 · 274 阅读 · 0 评论 -
排序(五):堆排序
【本篇内容图示流程分析均来自《大话数据结构》一书,作者—程杰】首先来看两张有规律存在的完全二叉树图示:图示来自《大话数据结构》左图中根结点是所有元素中最大的,右图的根结点是所有元素中最小的。再细看看,发现左图每个结点都比它的左右孩子要大,右图每个结点都比宫的左右孩子要小。这就是我们要讲的堆结构。堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其原创 2017-09-26 10:36:49 · 668 阅读 · 0 评论 -
二叉树:实现java操作二叉排序树(生成、插入、遍历、删除)
首先来了解一下二叉排序树的由来,也就是在什么情况下迫使老一辈头脑风暴的科学家发明使用这种方法。先说普通顺序存储(注意并不是有序),先来先坐,有点类似于“栈”。插入数据直接放到最末尾,删除中间数据的话可以把待删除数据和最后一位数据进行互换,也可以把待删除数据后的全部数据统一往前挪一位。这里实在没有顺序的前提下,删除和插入的效率都没有毛病,但是查找就有点差强人意了,或者说效果很悲观。那么对于有原创 2017-09-14 14:24:00 · 2421 阅读 · 0 评论 -
排序(二):选择排序
上篇博文介绍了冒泡排序,同时也对其进行了优化,这里再进行另外一种排序:简单选择排序。相比冒泡排序来说,其性能有略微提升。正如我们了解到的那样,冒泡排序是基于不断的比较数据大小进行交换实现的,极端情况下会进行N * (N - 1) / 2次交换。而选择排序最多进行N - 1 次交换。下面基于Java实现看看是怎么实现的: public static void sort(int[]原创 2017-09-21 17:13:08 · 230 阅读 · 0 评论 -
java实现(有序)数组插入元素
本实例是演示数据机构中最简单也是最基础的数据操作:即向(有序)数组中插入元素。直接上代码: int[] a = {27, 15, 48, 65, 2, 61, 36, 55}; int temp = 7, locatin = 6;// 待插入数据和插入的下标(从0开始) for (int tem : a) { System.ou原创 2017-08-28 16:34:08 · 3507 阅读 · 0 评论 -
找出一个字符串中最长不重复子串的长度
public static int lengthOfLongestSubstring(String str) { int n = str.length(); int ans = 0; for (int i = 0; i < n; i++) { for (int j = i + 1; j <= n; j++) {...原创 2019-03-16 20:22:39 · 1898 阅读 · 0 评论