数据结构学习
qq_30272539
这个作者很懒,什么都没留下…
展开
-
1、java 实现一个动态扩容的数组
我今天到大家实现的是一个动态扩容的数组,它是基于数组实现。一、数组的所有实现方法package com.ypl.demo;public interface Array<T> { public int getCapciaty(); public int getSize(); public boolean isEmpty(); public void ...原创 2019-03-19 16:57:43 · 1833 阅读 · 0 评论 -
16、计数排序
1、简单介绍1.计数排序的特点,计数排序最大的特点是稳定,并且排序的元素,之间的值差别不大。2、计数排序是一个稳定的排序,我们需要了解既然它只能够对整数进行排序,为什么还要保证其稳定性。3、既然如果保证稳定性,并且不只是对整数进行排序,它还能够对什么类型进行排序?4、计数排序的时间复杂度和空间复杂度,时间复杂度都是O(n+k) n表示的是元素的个数 k 表示数据之间的范围。5...原创 2019-04-05 23:03:07 · 191 阅读 · 0 评论 -
9、二分搜索树的删除(下篇)
一、简单介绍。1、二分搜索树的删除操作,其实并不简单,我们需要找到我们要删除的元素。然后分情况考虑。第一种,没有左孩子,我们直接获取一个节点,保持其右孩子,然后进行让要删除的节点的右孩子至于空,然后返回其右孩子。第二种,没有右孩子,我们直接获取一个节点,保存其左孩子,然后进行让要删除节点的左孩子至于空,然后返回其左孩子。第三种,左右孩子都为空,我们直接返回空。第四种,如果左右孩...原创 2019-03-28 22:05:39 · 125 阅读 · 0 评论 -
10、堆的实现(上篇)
一、堆的简单介绍1、堆在我们的实际生活中,我们用的比较多,想到堆,我们就想起了优先队列。优先队列,我们进队列的时候,我们使用的正常的进队列的方式,但是我们出队列的时候,我们出队列的时候,我们会根据某个优选规则,来出队列。我们是根据优先级的不同,来进行操作。我们不管是在我们玩游戏的时候,是或者cpu处理进程,或者多个线程竞争资源的时候,我们都是使用优先队列的实现。而优先队列的实现底层是使用的可能...原创 2019-03-28 22:54:18 · 99 阅读 · 0 评论 -
21、基于链表实现的LRU算法
一、简单介绍1、LRU 中文意思是 最近最少访问缓存淘汰,在我们的生活中到处可见。当我们用链表实现是需要O(n)时间复杂度。2、我们需要维护一个按照访问时间从大到小有序排列的链表结构。因为缓存大小有限,当缓存空间不够,需要淘汰一个数据的时候,我们就直接将链表头部的结点删除。(1)、当要缓存某个数据的时候,先在链表中查找这个数据。如果没有找到,则直接将数据放到链表的尾部;(2)、如果...原创 2019-04-11 21:28:47 · 528 阅读 · 0 评论 -
22、hash表的介绍(上)
一、简答介绍一、hash 函数的三个设计要素1. 散列函数计算得到的散列值是一个非负整数;2. 如果 key1 = key2,那 hash(key1) == hash(key2);3. 如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)。二、举例一个hashmap 的底层实现1. 初始大小HashMap 默认的初始大小是 16,当然这个默认值是可...原创 2019-04-11 21:48:23 · 285 阅读 · 0 评论 -
17、桶排序
1、简单介绍核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。1、稳定性:桶排序是稳定的排序。2、时间复杂度:O(n)3、它不是原地排序,需要额外的空间是O(n+m) m 表示的是 桶的个数。2、代码实现public static void bucketSort(int...原创 2019-04-08 19:46:53 · 259 阅读 · 0 评论 -
18、基数排序
1、简单介绍1、对电话号码进行排序我们这里也可以借助相同的处理思路,先按照最后一位来排序手机号码,然后,再按照倒数第二位重新排序,以此类推,最后按照第一位重新排序。经过 11 次排序之后,手机号码就都有序了。2、基数排序:根据每一位来排序,我们可以用刚讲过的桶排序或者计数排序,它们的时间复杂度可以做到O(n)。如果要排序的数据有 k 位,那我们就需要 k 次桶排序或者计数排序,总的时间复杂...原创 2019-04-08 20:05:39 · 225 阅读 · 0 评论 -
19、二分查找
一、简单介绍二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。O(logn) 惊人的查找速度。我们二分查找可以分成两个情况,一种是不存在重复元素。另外一种是出现重复元素的情况。二、代码实现1、不存在重复元素的二分查找 /** * 二分查找 ...原创 2019-04-08 20:17:33 · 268 阅读 · 0 评论 -
14、简单的排序算法
一、算法时间复杂度分析1、我们考虑一个排序算法的好坏,我们首先是应该考虑的点, 有最好时间复杂度,最坏时间复杂度,平均时间复杂度。2、时间复杂度的系数,常数 和低阶。3、比较的次数和交换的次数。4、额外空间复杂度。(原地排序)5、稳定性。冒泡排序的核心思想:我们进行相邻的元素进行比较,把最大的元素往后移动,直到全部有序。1、冒泡排序是一个原地排序,不需要额外的空间。2、冒...原创 2019-04-03 10:09:19 · 153 阅读 · 0 评论 -
13、递归代码的书写
一、简单介绍1、递归的本质递归的本质:将原来的问题,转换成更小的同一个问题。2、递归的实现条件一个问题的解可以分解成几个子问题的解。这个问题与与分解的子问题,除了数据规模不同,求解完全一样。存在递归终止条件。3、递归的两个重要属性 终止条件和递推公式。二、代码案例1、利用递归实现数组元素的相加。 public static int getSu...原创 2019-03-31 21:42:37 · 633 阅读 · 0 评论 -
15、快速排序和归并排序
1、简单的介绍1、归并排序的核心思想:我们将把数组中的元素分成两部分,对左边元素进行排序,对右边元素进行排序。然后对左右两边元素,进行归并操作。1、归并排序是稳定的。归并的过程,如果两个元素相等,先把左边的元素进行归并。2、归并排序不是原地排序,需要额外的内存空间。O(n)T(N)=2T(N/2)+O(N);3、master公式的使用T(N) = a*T(N/b) + O(N^d)...原创 2019-04-04 19:37:10 · 711 阅读 · 0 评论 -
2、动态数组实现栈的实现
一、栈的简单介绍1、栈是一种线性结构。我们可以通过数组和链表实现。它依赖的原则是先进后出的原则。2、栈可以实现括号匹配,表示式计算等功能。3、我们在在平常的函数调用中,都可能用到栈和队列。二、栈的数组实现方式。1、利用我们前面学的动态数组的实现方式。package com.ypl.demo;public interface Array<T> { pu...原创 2019-03-20 10:03:10 · 502 阅读 · 0 评论 -
6、利用链表实现队列和栈
一、利用链表实现栈。 因为栈是先进后出的基本原则。我们使用栈可以在链表的首部插入元素和删除元素。package com.ipp.list;public interface Stack<E> { int getSize(); boolean isEmpty(); void push(E e); E pop(); E peek();...原创 2019-03-24 21:58:28 · 251 阅读 · 0 评论 -
7、二分搜索树(上篇)
一、二分搜索树的简单概念。什么是二分搜索树,顾明思议,我们这棵二叉树是左子树元素,小于根节点的元素,小于右子树的元素。当我们进行插入或者查找元素的时候,我们首先通过在根元素,查找。如果当前元素比它大,就去右子树找。如果当前元素比它小,我们就去左子树找。如果相等,就说明找到。并且如果相等元素,我们在进行二分搜索树,插入的时候,我们不进行插入。然后,我们说一说二分搜索树的前序中序后序便...原创 2019-03-25 22:53:02 · 136 阅读 · 0 评论 -
8、二分搜索树便利(中篇)
一、二分搜索树便利的介绍 在我们实现二分搜索树中,我们学习了好多的知识,二分搜索树当中,我觉得最重要的是实现树的便利和查找操作。实现二分搜索树的便利,我们有两种不同的实现方式。1、第一种,递归实现。(1)、先序便利,我们可以通过先输出根节点,然后便利左子树,最后便利右子树。(2)、中序便利,我们可以先便利左子树,然后输出根节点,最后输出右子树。(3)、后续便利,我们...原创 2019-03-26 22:06:25 · 269 阅读 · 0 评论 -
11、堆的删除操作(中篇)
一、堆得删除操作的简单思路1、首先我们判断堆是不是为空,然后获取我们的堆顶元素,和我们的最后一个元素,进行交换。2、我们删除我们的最后一个元素,删除的元素,就是我们的堆顶元素,如果是最大堆,是最大元素,如果最小堆,就是最下元素。3、我们对第一个元素,进行shift'Down操作。因为堆得定义,比如最大堆,就是堆中的任意节点都会下于等于它的父亲节点。我们第一个元素,必须进行和它的孩子节点...原创 2019-03-30 23:19:56 · 2472 阅读 · 0 评论 -
12、最大堆和最小堆 的实现(下篇)
一、简单介绍1、我们前面已经用最大堆得例子,已经讲了所有的最大堆的操作。里面包过添加操作,用到我们shiftUp()操作。包过删除操作,我们用到sihftDown操作。然后就是通过一个数组,我们能够构建一个堆。也就是我们说的heapify 操作。2、最小堆的操作和上面的类似,只是比较的时候不一样。二、所有的代码实现1、最大堆的实现package com.ipp.d...原创 2019-03-30 23:27:35 · 222 阅读 · 0 评论 -
5、链表的实现
一、链表的简单介绍链表的实现,在我看来它的实现,是有两种不同的实现方式。第一种实现方式是带头指针的实现方式。第二种实现方式是不带头指针的实现方式。当我们考虑使用不带头指针的会比较复杂些。因为你要考虑插在链表头部插入和其他位置的插入式有区别的。每次的链表的插入要考虑是不是头部插入和头部删除。进行分情况处理。二、链表的基本实现。1、不带头指针的链表实现。定义的抽象接口...原创 2019-03-23 23:22:10 · 149 阅读 · 0 评论 -
3、栈的应用
一、栈的应用的实现栈的应用很广,函数的调用的底层实现,和实现表达式值得计算,可以实现括号的匹配,和浏览器的前进和后退的实现。1、栈的表达式的计算。package com.ypl.app;import org.junit.Test;import com.ypl.demo.ArrayStack;/** * * 遇到数字直接压人栈中。 左括号在进入栈中之前元素优先级最高。...原创 2019-03-21 20:38:26 · 510 阅读 · 0 评论 -
4、队列的实现
一、队列的简单介绍1、队列在我们的生活中到处可见,比如食堂排队打饭,银行排队办理业务等等。2、队列是一种先进先出的设计原则。3、队列是一种特别常用的数据结构,我们在我们的操作系统中,我们有用到优先队列。二、队列的基本实现。1、底层的接口实现定义的方法。package com.ypl.demo;public interface Queue<E> { i...原创 2019-03-22 22:33:15 · 267 阅读 · 0 评论 -
20、redis底层实现跳表
一、简单介绍1、我们为什么要使用跳表?当我们使用对一个链表进行查找的时候,我们需要的时间复杂度是O(n)。我们没有办法对一个有序的链表进行二分查找。当我们使用跳表实现,我们查找效率会很高,是O(logn)。2、跳表的时间复杂度分析每两个结点会抽出一个结点作为上一级索引的结点,那第一级索引的结点个数大约就是 n/2,第二级索引的结点个数大约就是 n/4,第三级索引的结点个数大约就...原创 2019-04-09 17:20:56 · 480 阅读 · 0 评论