
数据结构与算法
JokerDa
写完代码多检查两遍!
展开
-
(笔记整合)复杂度分析
一、什么是复杂度分析?1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。3.分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。4.复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。二、为什么要进行复杂度分析?1.和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高...转载 2019-02-28 17:41:03 · 296 阅读 · 0 评论 -
(笔记整合)堆
一、如何理解“堆”?堆是一种特殊的树。只要满足这两点,它就是一个堆。堆是一个完全二叉树;堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。对于每个节点的值都大于等于子树中每个节点值的堆,我们叫作“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫作“小顶堆”。其中第111个和第222个是大顶堆,第333个是小顶堆,第444个不是堆。二、如何实现一个...原创 2019-04-09 10:57:42 · 427 阅读 · 0 评论 -
(笔记整合)散列表
一、散列表的由来?1.散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。2.需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列函数,散列函数的计算结果称为散列值。3.将数据存储在散列值对应的数组下标位置。二、如何设计散列函数?总结3点设计散列函数的基本要求:1.散列函数计算得到的散列值是一个非负整数。2.若key...转载 2019-04-03 16:20:45 · 398 阅读 · 0 评论 -
(笔记整合)哈希算法
一、什么是哈希算法?1.定义将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。2.如何设计一个优秀的哈希算法?①单向哈希:从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。②篡改无效:对输入敏感,哪怕原始数据只修改一个Bit,最后得到的哈希值也大不相同。③散列冲突:散列冲突的概率要很小,对于...转载 2019-04-03 19:31:22 · 344 阅读 · 0 评论 -
(笔记整合)Trie树
一、什么是“Trie树”?Trie树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。Trie树到底长什么样子?比如有6个字符串,它们分别是:how,hi,her,hello,so,see。希望在里面多次查找某个字符串是否存在。如果每次查找,都是拿要查找的字符串跟这6个字符串依次进行字符串匹配,那效率就比较低...原创 2019-05-28 15:02:53 · 214 阅读 · 0 评论 -
(笔记整合)字符串匹配基础
一、BF算法?BF算法中的BF是Brute Force的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。在字符串A中查找字符串B,那字符串A就是主串,字符串B就是模式串。把主串的长度记作n,模式串的长度记作m。因为是在主串中查找模式串,所以n>m。作为最简单、最暴力的字符串匹配算法,BF算法...原创 2019-05-28 10:56:17 · 338 阅读 · 0 评论 -
LeetCode自己做的题目记录
1. 两数之和class Solution { public int[] twoSum(int[] nums, int target) { for(int i=0;i<nums.length;i++){ for(int j=0;j&原创 2018-12-09 19:46:13 · 5832 阅读 · 0 评论 -
LeetCode自己做的题目记录2
421. 数组中两个数的最大异或值class Solution { public int findMaximumXOR(int[] nums) { int max = 0; for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.lengt...原创 2019-01-19 15:20:26 · 966 阅读 · 0 评论 -
LeetCode自己做的题目记录3
989. 数组形式的整数加法class Solution { public List<Integer> addToArrayForm(int[] A, int K) { List<Integer&原创 2019-02-15 14:32:14 · 386 阅读 · 0 评论 -
(笔记整合)贪心算法
一、如何理解“贪心算法”?假设有一个可以容纳100kg物品的背包,可以装各种物品。有以下5种豆子,每种豆子的总量和总价值都各不相同。为了让背包中所装物品的总价值最大,如何选择在背包中装哪些豆子?每种豆子又该装多少呢?只要先算一算每个物品的单价,按照单价由高到低依次来装就好了。单价从高到低排列,依次是:黑豆、绿豆、红豆、青豆、黄豆,所以可以往背包里装20kg黑豆、30kg绿豆、50kg红豆。...原创 2019-05-28 17:04:37 · 311 阅读 · 0 评论 -
(笔记整合)分治算法
一、如何理解分治算法?分治算法(divide and conquer)的核心思想其实就是四个字,分而治之,也就是将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。这个定义看起来有点类似递归的定义。关于分治和递归的区别,在排序(下)的时候讲过,分治算法是一种处理问题的思想,递归是一种编程技巧。实际上,分治算法一般都比较适合用递归来...原创 2019-05-28 19:29:53 · 275 阅读 · 0 评论 -
(笔记整合)红黑树
一、什么是“平衡二叉查找树”?平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于1。从这个定义来看,我们讲的完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。但是很多平衡二叉查找树其实并没有严格符合上面的定义,我们学习数据结构和算法是为了应用到实际的开发中的,所以,没必去死抠定义。对于平衡二叉查找树这个概念,我们要从这个数据结构的由来,...原创 2019-04-08 15:32:14 · 306 阅读 · 0 评论 -
(笔记整合)排序优化
一、如何选择合适的排序算法?1.排序算法一览表2.为什选择快速排序?1)线性排序时间复杂度很低但使用场景特殊,如果要写一个通用排序函数,不能选择线性排序。2)为了兼顾任意规模数据的排序,一般会首选时间复杂度为O(nlogn)的排序算法来实现排序函数。3)同为O(nlogn)的快排和归并排序相比,归并排序不是原地排序算法,所以最优的选择是快排。二、如何优化快速排序?导致快排时间复杂度...转载 2019-03-28 15:44:21 · 176 阅读 · 0 评论 -
(笔记整合)跳表
一、什么是跳表?为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。如下图所示,其中down表示down指针,指向下一级节点。以此类推,对于节点数为n的链表,大约可以建立log2n-1级索引。像这种为链表建立多级索引的数据结构就称为跳表。二、跳表的时间复杂度?1.计算跳表的高度如果链表有n个节点,每2个节点抽取抽出一个节点作为上一级索...转载 2019-04-01 17:12:48 · 291 阅读 · 0 评论 -
(笔记整合)数据结构与算法学习
一、是什么:数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。数据结构是为算法服务的,算法是要作用再特定的数据结构上的。二、学什么:1 效率和资源消耗的度量衡–复杂度分析。2 最常用、最基础的20个数据结构与算法,学习他们的:“来历”、“特点”、“适合解决什么问题”和“实际的应用场景”。常用数据结构:数组、链表、栈、队列、散列表、二叉树‘、堆、跳表、图、Tire树...原创 2019-02-28 17:40:30 · 785 阅读 · 0 评论 -
(笔记整合)链表
一、什么是链表?1.和数组一样,链表也是一种线性表。2.从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。3.链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。二、为什么使用链表?即链表的特点1.插入、删除数据效率高O(1)级别(只需更改指针指向即可),随机访问效率低O(...转载 2019-03-04 22:18:38 · 185 阅读 · 0 评论 -
(笔记整合)数组
1. 数组如何实现随机访问1) 数组是一种线性数据结构,用连续的存储空间存储相同类型数据I) 线性表:数组、链表、队列、栈 非线性表:树 图II) 连续的内存空间、相同的数据,所以数组可以随机访问,但对数组进行删除插入,为了保证数组的连续性,就要做大量的数据搬移工作a) 数组如何实现下标随机访问。引入数组再内存种的分配图,得出寻址公式b) 纠正数组和链表的错误认识。数组的查找操作时...转载 2019-03-02 11:54:44 · 204 阅读 · 0 评论 -
(笔记整合)队列
一、什么是队列?1.先进者先出,这就是典型的“队列”结构。2.支持两个操作:入队enqueue(),放一个数据到队尾;出队dequeue(),从队头取一个元素。3.所以,和栈一样,队列也是一种操作受限的线性表。二、如何实现队列?1.队列APIpublic interface Queue<T> { public void enqueue(T item); //入队 pub...转载 2019-03-14 20:52:10 · 203 阅读 · 0 评论 -
(笔记整合)递归
一、什么是递归?1.递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。2.方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。3.基本上,所有的递归问题都可以用递推公式来表示,比如f(n) = f(n-1) + 1;f(n) = f(n-1) + f(n-2);f(n)=n*f(n-1);二、为什么使用递归...转载 2019-03-15 11:19:15 · 176 阅读 · 0 评论 -
(笔记整合)冒泡排序、插入排序、选择排序
一、排序方法与复杂度归类1.几种最经典、最常用的排序方法:冒泡排序、插入排序、选择排序、快速排序、归并排序、计数排序、基数排序、桶排序。2.复杂度归类冒泡排序、插入排序、选择排序 O(n2)快速排序、归并排序 O(nlogn)计数排序、基数排序、桶排序 O(n)二、如何分析一个“排序算法”?1.算法的执行效率(1) 最好、最坏、平均情况时间复杂度。(2) 时间复杂度的系数、常数和...转载 2019-03-15 16:46:16 · 306 阅读 · 0 评论 -
(笔记整合)归并排序、快速排序
一、分治思想1.分治思想:分治,顾明思意,就是分而治之,将一个大问题分解成小的子问题来解决,小的子问题解决了,大问题也就解决了。2.分治与递归的区别:分治算法一般都用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程技巧。二、归并排序1.算法原理先把数组从中间分成前后两部分,然后对前后两部分分别进行排序,再将排序好的两部分合并到一起,这样整个数组就有序了。这就是归并排序的核心思...转载 2019-03-25 16:22:14 · 365 阅读 · 0 评论 -
(笔记整合)栈
一、什么是栈?1.后进者先出,先进者后出,这就是典型的“栈”结构。2.从栈的操作特性来看,是一种“操作受限”的线性表,只允许在端插入和删除数据。二、为什么需要栈?1.栈是一种操作受限的数据结构,其操作特性用数组和链表均可实现。2.任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎所有的操作,难免会引发错误操作的风险。3.所以,当某个数据集合只涉及在某端...转载 2019-03-13 20:30:20 · 161 阅读 · 0 评论 -
(笔记整合)二分法查找
一、什么是二分查找?二分查找针对的是一个有序的数据集合,每次通过跟区间中间的元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间缩小为0。二、时间复杂度分析?1.时间复杂度假设数据大小是n,每次查找后数据都会缩小为原来的一半,最坏的情况下,直到查找区间被缩小为空,才停止。所以,每次查找的数据大小是:n,n/2,n/4,…,n/(2k),…,这是一个等比数列。当n/(2...转载 2019-03-30 16:50:04 · 723 阅读 · 0 评论 -
(笔记整合)二叉树
一、树1.树的常用概念根节点、叶子节点、父节点、子节点、兄弟节点,还有节点的高度、深度以及层数,树的高度。2.概念解释节点:树中的每个元素称为节点父子关系:相邻两节点的连线,称为父子关系根节点:没有父节点的节点叶子节点:没有子节点的节点父节点:指向子节点的节点子节点:被父节点指向的节点兄弟节点:具有相同父节点的多个节点称为兄弟节点关系节点的高度:节点到叶子节点的最长路径所包含...原创 2019-04-04 17:42:08 · 683 阅读 · 0 评论 -
(笔记整合)回溯算法
一、如何理解“回溯算法”?在我们的一生中,会遇到很多重要的岔路口。在岔路口上,每个选择都会影响我们今后的人生。有的人在每个岔路口都能做出最正确的选择,最后生活、事业都达到了一个很高的高度;而有的人一路选错,最后碌碌无为。如果人生可以量化,那如何才能在岔路口做出最正确的选择,让自己的人生“最优”呢?可以借助前面学过的贪心算法,在每次面对岔路口的时候,都做出看起来最优的选择,期望这一组选择可以使得...原创 2019-05-29 11:49:29 · 515 阅读 · 0 评论