数据结构
文章平均质量分 88
从零开始学习数据结构
Lockey-s
这个作者很懒,什么都没留下…
展开
-
掌握及手把手实现哈希表
哈希表概念哈希函数、冲突插入、查找元素哈希函数和导致冲突的原因避免冲突解决冲突闭散列开散列二级目录三级目录概念在一组数据当中,想要找到关键字,最差得 O(N) 的时间复杂度。如果要在二叉搜索树当中找的话,最好也是:log 以2为底 N。最差是 n 。而 哈希表 就可以不经过任何比较就拿到数据。存的时候按照某个方法去存,拿的时候也是按照某个方法去拿。哈希表也叫散列表。时间复杂度是 O(1)。哈希函数、冲突插入、查找元素根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放。查找的时原创 2022-03-16 20:14:31 · 2339 阅读 · 11 评论 -
轻松掌握内部类
内部类本地内部类实例内部类静态内部类匿名内部类本地内部类定义在方法当中的类,只能在当前方法当中使用。实例内部类在实力内部类当中,不能定义静态的成员变量,如果非要定义,只能定义一个静态的常量。因为内部类是写在哟个类里面,所以那个类就成了外部类。因为定义在类里面,所以可以看作外部类的实例成员。使用内部类也是需要对象的,也可以继承类,实现接口。把内部类当作一个正常的类去看待就好了。代码如下:interface A {}//这是一个普通的类:因为有了内部类,所以这个类就可以当作外部类class O原创 2022-03-14 21:59:49 · 316 阅读 · 16 评论 -
轻松掌握 Map 和 Set
Map 和 Set概念MapputgetgetOrDefaultremoveSetentrySetset 自动去重Iterator 接口概念map 和 set 是一种专门用来搜索和查询的容器或数据结构,效率很高。是为了解决在 “增删查改” 情况下使用的数据结构。map set 模型:一般把搜索的数据称为关键字 (key) ,和关键字对于的称为值(value) 称为 key-value 的键值对。纯 key 模型:set。key - value 模型:mapMapHashMap 在存储元素的时候原创 2022-03-06 21:02:52 · 853 阅读 · 22 评论 -
轻松掌握泛型
泛型概念实例通过 Object 放入多种数据类型泛型写法泛型的上界写泛型类,求出数组当中的最大值静态泛型方法泛型当中的父子类关系通配符通配符的上界通配符的下界概念在《Java编程思想》当中是这样说的:一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。也就是说,泛型是适用于多种类型的。把泛型作为了参数进行传递。实例泛型是将数据类型参数化,进行传递。可以将数据类型参数化,编译时自动进行类型检查和转换。通过 O原创 2022-03-02 21:15:42 · 610 阅读 · 20 评论 -
常见的排序-Java详解
排序排序的稳定性直接插入排序复杂度及稳定性希尔排序复杂的及稳定性选择排序复杂度及稳定性交换方法堆排序复杂度及稳定性冒泡排序复杂度及稳定性快速排序复杂度及稳定性归并排序递归方法非递归方法二级目录三级目录排序的稳定性如下图所示:通过上面这种方法就能判断排序是否稳定。一个稳定的排序,可以实现为不稳定的排序,但是一个本身不稳定的排序,是不能变成稳定的排序。直接插入排序类似于冒泡排序。假设有如下数据:12 5 9 4 10,拿第一个数据,然后用后面的数据和它相比较,放在前面。如下图所示:默认第一个数据原创 2022-03-01 16:55:03 · 702 阅读 · 16 评论 -
基于堆实现对象比较
对象比较元素的比较对象的比较equalsCompareTo通过比较器比较直接 new 一个比较器来比较重写 equals 方法来比较元素的比较在 Java 当中,基本类型的对象可以直接比较大小。代码如下:public static void main(String[] args) { int a = 10; int b = 20; System.out.println(a > b); System.out.println(a < b); System原创 2022-02-26 17:06:12 · 424 阅读 · 21 评论 -
轻松掌握堆的使用
堆堆的概念实现堆定义参数向下调整说明过程如图创建堆向上调整判断是否满插入堆判断堆是否为空出堆顶元素拿到堆顶元素堆排序代码测试测试堆排序优先级队列堆的概念堆是一颗顺序存储的二叉树,激素hi将二叉树层序遍历放到数组当中,是完全二叉树。已知双亲(parent)的下标,则:左孩子(left)下标 = 2 * parent + 1。右孩子(right)下标 = 2 * parent + 2。已知孩子(不区分左右)(child)下标,则:双亲(parent)下标 = (child - 1) /原创 2022-02-25 21:29:27 · 877 阅读 · 17 评论 -
一文掌握二叉树
这里写目录标题树形结构节点的度树的度叶子结点或终端结点双亲结点或父结点孩子结点或子结点根节点结点的层次树的高度或深度兄弟节点树的表示形式二叉树二叉树的组成情况两种特殊的二叉树二叉树的性质二叉树的存储实现二叉树实现类创建树前序遍历中序遍历后序遍历获取二叉树当中结点的个数遍历方法子问题方法二级目录三级目录树形结构树是一种非线性的数据结构,它是由 n 个有限节点组成一个具有层次关系的集合。因为看起来像倒过来的树,所以叫做树形结构。树形结构当作子树不能有交集,否则就不是树形结构。节点的度一个结点含有子树原创 2022-02-12 17:51:45 · 1101 阅读 · 20 评论 -
队列的使用及实现队列
队列的使用及实现队列的概念普通队列 Queue双端队列 Deque循环队列队列的使用插入元素 add offer删除元素 remove poll得到队头元素 element peek双端队列的使用插入删除得到队头队尾元素实现队列实现 Node定义队头和队尾向队列当中增加元素判断是否为空在队列当中弹出元素得到队头元素测试循环队列计算循环队列的下标图示第三种方法实现循环队列初始化入队判满判空出队得到队头元素得到队尾元素测试:队列的概念队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,原创 2022-02-02 22:20:18 · 5253 阅读 · 10 评论 -
栈的轻松使用及手把手实现栈
这里写目录标题栈的概念与特点栈的使用压栈出栈求得栈顶元素判断栈是否为空栈的比较手把手实现栈写出顺序表判断是否满了压栈判断是否为空出栈比较栈顶元素栈的大小测试栈的概念与特点栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。如图所示:这里的 1 2原创 2022-01-30 17:02:13 · 665 阅读 · 18 评论 -
轻松掌握List
这里写目录标题包装类装箱与拆箱(装包与拆包)阿里面试题ListList 使用List 的多种输出方式直接通过字符串输出通过 for 循环打印通过 foreach 来输出通过迭代器打印专门打印 List 的迭代器ListIterator 和 Iterator 的关系二级目录三级目录包装类包装类是根据基本类型出现的,八大基本类型对应着八种包装类:要注意的是:String 不是包装类。包装类的好处在于:可以完成对数据的操作。例如:把字符串变为整形:public static void main(Stri原创 2022-01-28 19:12:59 · 1433 阅读 · 17 评论 -
集合与背后的逻辑框架
集合与框架CollectionCollection 创建Collection 使用不加泛型Collection 使用泛型Collection 方法Map 接口Map 的存储结构哈希Map 和 TreeMap 的有序与无序二级目录三级目录CollectionCollection 接口,在 Java 当中,Collection 也是重要的数据结构。Collection 创建在创建 Collection 的时候,要通过 new 关键字来使用。但是查看 Collection 源码的时候,发现 Collec原创 2022-01-25 21:48:43 · 481 阅读 · 14 评论 -
手把手实现双链表
手把手实现双链表双链表原理双链表实现定义节点输出节点得到链表的长度查找是否包含关键字 key 在链表当中头插法尾插法删除第一次出现关键字为key的节点找到要插入位置的节点在任意位置插入一个数据节点删除所有值为 key 的节点清空链表双链表原理双向链表的实现就是在单链表基础上又增加了一个指向前面节点的引用。原理图如下:因为头节点是没有前驱节点的,所以头节点的 prev 是 null ,而尾节点是没有下一个节点的,所以尾节点的 next 是 null 。双链表实现定义节点写一个类,将节点的值,前一原创 2021-12-04 20:56:00 · 786 阅读 · 19 评论 -
轻松实现单链表——Java
单链表什么是链表?链表的实现链表的初始化创建一个头节点创建链表打印链表查找链表是否包含关键字 key求单链表的长度二级目录三级目录什么是链表?链表是一种物理存储结构上非连续存储结构,连接顺序是通过链表链表当中的引用来实现的。也就是说一个节点内存着下一个节点的地址。但要注意的是,链表的最后一个节点的指向是 null 。如下图所示:head 表示链表的第一个头节点。next 就是指向下一个节点的地址,也是下一个地址的引用。链表的实现链表的初始化在实现链表的时候,每一个节点都有两个元素:链表的值和下原创 2021-11-29 16:47:33 · 1010 阅读 · 26 评论 -
手把手教你学会顺序表
顺序表顺序表概念接口实现先初始化顺序表打印顺序表返回顺序表的长度判断顺序表满没满在 pos 位置新增元素判断是否包含某个元素查找某个元素的位置,找不到就返回 -1判断顺序表是否为空获取 pos 位置的元素把 pos 位置的元素设置为 val删除第一次出现的元素 key清空顺序表顺序表概念顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,我们这里是用数组存储数据。在数组上完成数据的增删查改。线性表分为:静态顺序表:使用定长数组存储。动态顺序表:使用动态开辟的数组存储。静态顺序表适原创 2021-11-06 13:56:52 · 638 阅读 · 13 评论 -
Java——时间复杂度、空间复杂度详解
复杂度算法效率时间复杂度什么是时间复杂度推导大 O 阶的方法算法情况计算冒泡排序的时间复杂度计算二分查找的时间复杂度计算阶乘递归的时间复杂度计算斐波那契递归的时间复杂度?空间复杂度计算冒泡排序的空间复杂度计算斐波那契数列的空间复杂度(非递归)计算阶乘递归Factorial的时间复杂度算法效率在使用当中,算法效率分为两种,一是时间效率(时间复杂度),二是空间效率(空间复杂度)。时间复杂度是指程序运行的速度。空间复杂度是指一个算法所需要的额外的空间。时间复杂度什么是时间复杂度计算程序运行的时间不能拿简原创 2021-11-04 18:54:40 · 10083 阅读 · 17 评论