数据结构与算法之美(课后题总结)
文章平均质量分 58
课后题,有适量延伸和自己的理解
SeanLee_Coder
这个世界上只有10种人:懂得二进制的和不懂得二进制的。
展开
-
15算法思想之分治算法
1. 分治算法思想分治算法(divide and conquer)的核心思想其实就是四个字,分而治之,也就是将原问题划分为n个规模较小,并且结构与原问题相似的子问题,递归的解决这些子问题,然后再合并其结果,就得到原问题的解。 分治和递归的区别:分治是一种处理问题的思想,递归是一种编程技巧。实际上分治算法一般都比较适合用递归来实现。分治算法的递归实现中,每一层递归都会涉及这样三个操作: (1)分解:将原问题分解成一系列子问题; (2)解决:递归的求解各个子问题,若子问题足够小,则直接求解 (3原创 2021-05-25 20:29:06 · 451 阅读 · 0 评论 -
13字符串匹配之KMP算法、Trie树、AC自动机
1. KMP算法KMP算法框架代码时间复杂度:o(n+m),其中m为next数组的长度,n为主串的长度。 空间复杂度:o(m),其中m为next数组的长度。class Solution{ public static int KMP(char[] a, int n, char[] b, int m){ int[] next = getNexts(b, m); int j = 0; for(int i=0; i<n; i++){原创 2021-05-22 11:49:50 · 630 阅读 · 0 评论 -
12 字符串匹配之BM(Boyer-Moore)算法的原理讨论与实现
BM(Boyer-Moore)算法是一种非常高效的字符串匹配算法,有实验统计,它的性能是著名的KMP性能的三到四倍。在本文的描述中,我们将被匹配的字符串叫做主串,拿去主动和被人匹配的较短的串叫做模式串。BM(Boyer-Moore)算法的本质(KMP其实也是这样)是寻找当模式串的与主串中字符匹配时,怎样将模式串往后多滑动几位。对BM算法的原理主要包括两部分:坏字符规则和好后缀规则。下面先介绍这两个规则。1.坏字符规则与传统的BK算法和RF算法按照模式串下标从小到大的顺序匹配不同,BM算法是按照模式串原创 2021-05-06 19:22:18 · 353 阅读 · 0 评论 -
11图的基本算法之广度优先搜索、深度优先搜索
广度优先搜索、深度优先搜索这种基于“图”这种数据结构,这是因为图的这种数据结构表达力极强,绝大部分的搜索问题的场景都可以抽象成图。我们首先介绍图(无向图)的基本存储:1. 图的存储(采用邻接表存储)public class Graph{ private int v; //顶点个数 private LinkedList[] adj; //邻接表 public Graph(int v){ this.v = v; this.adj原创 2021-05-05 20:55:17 · 283 阅读 · 0 评论 -
10堆的应用之常见算法实现
1. 堆的应用之求topktopk问题,无论是静态数据集合还是动态数据集合,都可以使用小顶堆的方式解决。如果待处理的数据是动态数据集合,小顶堆的使用优势非常明显,只需要维持一个k大小的小顶堆,就可以很轻松的实现获取动态topk,因为加入新的数据进去的时候可以快速的实现维护这个小根堆。本文仅实现了对静态数据集合的topk元素的获取:时间复杂度是o(nlogk) 空间复杂度为o(1)class Solution{ public int[] findTopK(int[] a,int k){原创 2021-05-05 16:12:37 · 192 阅读 · 0 评论 -
09堆基础之堆的插入、删除操作及用堆实现排序
在讨论堆的两个基本操作之前,我们首先要弄清楚什么是堆。堆是树的一种,什么样的树可以称之为堆?需要满足以下两个条件:堆是一个完全二叉树 堆中任意一个节点的值都必须大于等于(或者小于等于)其子树每个节点的值1. 往堆中插入一个元素(也是建堆的过程)从下往上的方法实现(大顶堆):主要的时间消耗在于堆化操作,所以时间复杂度为o(logn) 空间复杂度为o(1)public class Heap{ int []a; //存储着一个堆,从下标1开始存储数据 int n; /原创 2021-05-05 10:09:06 · 970 阅读 · 0 评论 -
08二叉树基础之二叉查找树
二叉查找树要求,在树中任意一个节点,其左子树中的任一个节点的值要小于该节点,其右子树中的任一个一个节点的值要大于该节点。这个要求是二叉查找树能够快速进行查找、插入、删除操作的基础。1. 二差查找树的查找操作二差查找树查找某一个元素的过程是一个递归的过程。先将一个元素的值和根节点进行比较,如果元素的值等于根节点,则返回该节点;如果元素的值小于根节点则递归的在左子树中查找;如果元素的值大于根节点则递归的在右子树中进行查找。class Node{ public int val; pu原创 2021-05-04 16:37:54 · 148 阅读 · 0 评论 -
07二叉树基础之前序、中序、后序、层次遍历
在编写二叉树的几种遍历方式的代码之前,我们需要了解二叉树的一些基本概念什么叫做树的高度、深度以及层数:高度,节点到叶子节点的最长路径(边数);深度:根节点到这个节点所经历的边数的个数;层数:节点的深度+1 什么叫做完全二叉树:叶子节点都在最底下两层,最后一层节点都要靠左排列,并且除了最后一层,其它层的节点个数都要达到最大。 存储二叉树可以有哪几种方法?那种方法最常用?那种二叉树最适合用数组来存储?(1)可以用链表或者数组存储二叉树 (2)链表最常用(3)完全二叉树最适合用数组来存储,因为最节省数组空原创 2021-05-03 21:19:38 · 156 阅读 · 0 评论 -
06二分查找理解与应用
1. 二分查找的思想二分查找针对的是一个有序的数据集合,查找的思想类似于分治思想,每次都与区间中间的元素对比,将区间的大小缩小为原来的一半,直至找到所找的元素或者区间的大小变为0二分查找的时间复杂度:o(logn),非常高效 二分查找应用的场景比较局限:(1)在顺序表(数组)上进行使用(需要数据结构支持随机访问的特点才能体现其查找优势)(2)针对插入和删除特别频繁的动态数组不太适合使用二分查找,因为维护序列的有序性所需要的成本太高(3)数据量太小(无法体现其优势)和数据量太大(使用的是数组,需要连原创 2021-05-03 11:37:09 · 227 阅读 · 0 评论 -
05排序操作之桶排序、计数排序、基数排序
桶排序、计数排序、基数排序这三种排序因为时间复杂度都是o(n)线性的,所以这三种排序方法都属于线性排序。这三种算法的原理都不难,时间复杂度和空间复杂度的分析也比较简单,所以我们将讨论的重心放在三种算法各自的适用场景上。1. 桶排序桶排序的思想是将待排序的数据分到几个有序的桶里,再将每个桶内的数据自行排序,然后再把每个桶内的数据按顺序取出,得到的序列就是有序的。时间复杂度分析:如果要排序的数据有 n 个,我们把它们均匀地划分到 m 个桶内,每个桶里就有 k=n/m 个元素,桶排序的时间复杂度最终取原创 2021-05-02 17:07:54 · 175 阅读 · 0 评论 -
04排序操作之归并、快排
前面所讲的冒泡、插入和选择排序,因为平均时间复杂度为o(n^2),所以仅仅适合小数据量的排序工作。在数据量比较大时,平均时间复杂度为o(nlogn)的归并和快排就派上用场了,下面分别介绍归并排序和快速排序。1. 归并排序最好、最坏、平均时间复杂度都为o(nlogn) 不属于原地排序算法,其空间复杂度为o(n),因为merge函数中需要使用额外的空间 其排序的关键在于merge函数,merge函数中可以实现稳定排序,所以整个归并排序过程是稳定的class solution{ publi原创 2021-05-02 11:58:34 · 262 阅读 · 0 评论 -
03排序操作之冒泡、插入、选择排序
在排序算法中我们重点从三个方面讨论其特性:算法的执行效率(最好时间复杂度、最坏时间复杂度、平均时间复杂度):基于比较的排序算法需要考虑元素的比较次数、移动(交换)次数 算法的空间复杂度:原地排序(特指空间复杂度为o(1)的排序方法) 算法的稳定性:实际应用场景:订单先按金额排序,对于金额相同的订单按照时间再排序1. 冒泡排序最好时间复杂度:o(n),表示数组本来就有序排序,仅仅进行一次从前到后的比较;最差时间复杂度:o(n^2),表示数组恰好是倒序的,不能提前终止;平均时间复杂度:o(n^2)原创 2021-05-01 22:37:38 · 188 阅读 · 0 评论 -
02链表下:面试中常用到的链表算法(熟悉链表操作)
1. 删除链表中倒数第n个节点(leetcode19)思路:两指针法,前一个指针先走n步,然后两个指针一起走,当前一个指针走到链尾时,后一个指针正好位于待删除节点的上一个节点复杂度分析:时间复杂度o(n),空间复杂度o(1)注意:对链表只有一个节点时边界情况的考虑及处理方式/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; *原创 2021-05-01 17:00:04 · 123 阅读 · 0 评论 -
01链表上:如何判断一个字符串是否是回文字符串?如果这个字符串是用单链表存储的呢?
链表上:如何实现LRU(Least Recently Used)缓存淘汰算法?思考题:如何判断一个字符串是否是回文字符串?如果这个字符串是用单链表存储的呢?(1)如何判断一个字符串是否是回文字符串(仅考虑字母和数字,但字符串中可能包含其他字符)?解法1:思路:双指针法时间复杂度o(n),空间复杂度o(1)具体代码如下:classSolution{publicbooleanisPalindrome(Strings){intlen=s.le...原创 2021-05-01 12:00:58 · 344 阅读 · 0 评论