数据结构 与 算法
数据结构基础知识和一些算法思想
@另维吖
种一棵树最好的时间是十年前,其次是现在。
展开
-
如何分析一个排序算法及常见问题
如何分析一个排序算法?算法的执行效率:最好、最坏、平均时间复杂度(对于同一阶时间复杂度的排序算法性能对比可能会把系数、常数和低阶考虑到)基于比较的排序算法执行的适合会涉及到元素比较大小和元素的移动与交换,所以分析效率的时,比较次数、交换或者移动的次数也可以考虑进去排序算法的内存消耗原地排序,指空间复杂度是 O(1) 的排序算法。排序算法的稳定性待排序序列中存在值相等的元素,经过排序之...原创 2020-04-17 00:21:38 · 1055 阅读 · 0 评论 -
基于比较的快速排序-时间复杂度为O(nlogn)
快速排序快排利用的是分治思想。如果要排序数组中下标从 p 到 r 之间的一组数据,选择p 到 r 之间的任意一个数据作为分区点pivot。遍历 p 到 r 之间的数据,将小于pivot的放到左边,将大于pivot的放到右边,将pivot放到中间。经过这一步骤后数组 p 到 r 之间的数据就被分为了三个部分。数组 p 到 r 之间的数据就被分成了三个部分,前面 p到 q-1 之间都是小于 pi...原创 2020-04-16 23:27:50 · 654 阅读 · 0 评论 -
基于比较的归并排序-时间复杂度为O(nlogn)
归并排序如果要排序一个数组,先把数组从之间分成前后两部分,并将这两部分划分为最小单位后排序,最后将排好序的两部分再合并,这样整个数组就有序了。其实,归并排序可以用分治的思想最后用递归的方式自顶向下归并排序,其实如果自底向上看的化也可以用循环来解决。方式一:自底向下的归并排序(递归法)分析过程:写出归并排序的递推公式:mergeSort(p_r) = merge(merge(mer...原创 2020-04-16 22:07:29 · 669 阅读 · 0 评论 -
基于比较的选择排序-时间复杂度为O(n^2)
选择排序(Selection Sort)选择排序算法的实现思路类似于插入排序,也分已排序区间和为排序区间,但是选择排序,每次都会从未排序区间中找到最小元素,将其放到已排序区间的末尾详细代码public static void selectSort(int[] arr){//表示选择的趟数 for (int i = 0; i < arr.length-1; ++i) { ...原创 2020-04-16 20:01:46 · 444 阅读 · 0 评论 -
基于比较的插入排序-时间复杂度O(n^2)
直接插入排序(Insert Sort)将数组中的数据分为两个区域,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想就是取未排序区间中的元素,在已排序区间中从后往前找到最合适的位置将其插入,并保证已排序区间数据一直有序,重复这个过程,直到未排序区间中元素未空,算法结束。以上插入排序也包含两种操作,元素比较和元素移动。当需要将数据 a 插入到已排序区间...原创 2020-04-16 18:41:03 · 384 阅读 · 0 评论 -
基于比较冒泡排序-时间复杂度O(n^2)
冒泡排序(Bubble Sort)只操作相邻的两个数据,每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足让它两互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。eg:对于一组数据 4、5、6、3、2、1第一次冒泡的过程:经过了 5 次比较,此时 3 已经在正确的位置了,即每一次冒泡在至少有一个位置会调整到最终的位置...原创 2020-04-16 18:04:36 · 2210 阅读 · 2 评论 -
算法常见复杂度分析
算法(algorithm) 是指用来操作数据和解决问题的一组方法。对于同一个问题,使用不同的算法,结果一眼但是过程种消耗的资源与时间是不同的,衡量一个算法的优劣常常从时间和空间两个维度思考。分析方法是大O复杂度分析法。时间维度:算法执行所消耗的时间,即时间复杂度空间维度:算法执行所消耗的内存,即空间复杂度一、大O时间复杂度分析法1> 概念:并不表示代码真正执行花费的时间,而是表示...原创 2020-04-16 15:00:11 · 1172 阅读 · 0 评论 -
字符串相关之统计回文
问题描述:将字符串B插入字符串A使产生的字符串是一个回文串。你有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。例如:A = “aba”,B = “b”。这里有4种把B插入A的办法:在A的第一个字母之前: “baba” 不是回文在第一个字母‘a’之后: “abba” 是回文在字母‘b’之后: “abba” 是回文在第二个字母’a’之后 “aba...原创 2020-04-01 17:49:18 · 197 阅读 · 0 评论 -
递归的深度理解
1、递归的理解一个方法在执行的过程中调用自身,就称为“递归”,其中递归要满足有一个趋于终止的条件可以类比于数学上的“数学归纳”,有一个起始条件,还有一个递推公式可以拆分为“递”和“归”这两个过程举个例子:当你在电影院看电影,由于太黑你们都就近找了位置直接坐下,但你需要直到这是第几排,于是你就会问前面的兄弟,然后等待回答,前排的兄弟可能不知道,于是又去问了他前排的兄弟并等待回答…就这样...原创 2019-10-17 11:31:44 · 4577 阅读 · 1 评论 -
堆的创建和基本操作
1、堆的概念如果有一个关键码的集合 K={K0,K1,K2,…,Kn-1},把所有完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i +1 且 Ki <= K2i + 2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为 小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。堆的性...原创 2020-04-02 12:34:00 · 1677 阅读 · 0 评论 -
优先级队列基础知识和模拟实现
1、概念:优先级队列也是一种抽象数据类型。优先级队列中的每个元素都有优先级,而优先级高(或者低) 的将会出队,而优先级相同的则按照其在优先级队列中的顺序依次出队。常常有如下操作将元素添加到队列将最大或最小元素删除...原创 2020-04-01 22:53:42 · 320 阅读 · 0 评论 -
二叉树的遍历方式及优化
1、二叉树的前序遍历分析1、空树---->直接返回’2、非空:将根结点入栈循环进行以下操作:A.取栈顶元素—> cur peek()B.遍历该元素 (因为取得栈顶元素始终是左子树,所i。。)C.删除栈顶元素D.如果cur的右子树存在,将右子树入栈E.如果cur的左子树存在,将左子树入栈方式一:借助栈:public class TreeNode { in...原创 2020-03-31 14:32:21 · 504 阅读 · 0 评论 -
平衡二叉树的判断和优化
1、二叉树的最大高度分析:二叉树的高度为根节点到最远叶子节点的最长路径上的节点数。思路:比较根结点的左右子树的最大高度 + 1(到根结点的高度);递到叶子结点那一层把高度依次返回给双亲结点,直到根根结点。递推关系:而每一个结点的左子树高度都等于下一个结点的左子树高度+1(右子树那一路递归同理)递归出口:递到最左子树为null public int maxDepth(TreeNode ...原创 2020-03-06 13:38:02 · 302 阅读 · 0 评论 -
两棵二叉树是否相同、另一棵树的子树
一、判断两棵二叉树树是否相同要求:给定两个二叉树,编写一个函数来检验它们是否相同两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的分析:有序树结构相同值域相同思路:1、题中未说明二叉树是否未空树,需要考虑极端情况if(p == null && q == null) //约定两棵空树相同 return trueif(p == null || q ...原创 2020-03-05 14:41:39 · 444 阅读 · 0 评论 -
由二叉树概念引起的基本操作
1、二叉树的基本实现存储结构:顺序存储和类似于链表的链式存储表示形式:孩子表示法、孩子双亲表示法、孩子兄弟表示法等2、二叉树的创建3、二叉树的遍历1> 概念:遍历就是指沿着某条搜索线路,依次对树中每个结点做一次且仅作一次的访问。访问结点所做的操作依赖于具体问题(比如打印结点内容,结点内容加一等)2>三种遍历方式NLR:前序遍历(Preoder Traversal) ...原创 2020-03-04 16:49:55 · 94 阅读 · 0 评论 -
二叉树相关基础知识重点总结
1、二叉树的概念一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加上两棵别称为左子树和右子树的二叉树组成。二叉树的特点每个结点最多由两棵子树,即二叉树不存在度大于 2 的结点。二叉树的子树有左右之分,其子树的次序不能颠倒,因此二叉树是有序树。以上几种二叉树的形态,从左往右依次是:空树、只有根结点的二叉树,结点只有左子树的二叉树、结点只有右子树的二叉树、结点左右子树均...原创 2020-02-29 13:56:16 · 744 阅读 · 0 评论 -
由二叉树看多路递归
问题1、求一棵二叉树的节点个数分析:从二叉树的概念看:空树:节点个数是0非空:根节点+根节点的左子树节点+根节点的右子树节点从递归的角度看节点个数 = 根节点+左子树(根节点+左子树(…))+右子树(根节点+右子树(…))一个问题可以转换为多个子问题,多个子问题与原问题有相同的解法//定义一棵二叉树class BTNode{ BTNode left; //根节点...原创 2020-02-29 00:19:06 · 196 阅读 · 0 评论 -
图式详解复制带随机指针的链表
1、题目描述给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝复制后2、分析这里需要注意,要返回的链表是旧链表的深拷贝,所以新链表的数据域、next域和随机指针域random都必须是一模一样。思路很难打开,但是肯定是要借助原链表的。具体做法:将复制链表的节点一个个插入到原链表中,使得旧链表和复制链表串为一个链表。具体...原创 2019-11-20 23:49:57 · 129 阅读 · 0 评论 -
图示详解删除链表的倒数第K个节点
1、题目描述:给定一个链表,删除链表的倒数第n个节点,并且返回链表的头节点示例:给定一个链表:1->2->3->4->5,和 n = 2当删除了倒数第二个节点后,链表变为 1->2->3->5说明:给定的n保证是有效的,尝试使用一趟扫描实现。2、分析如下:首先想当我们要删除单链表的某个节点的时候,有两种办法:A:一个让当前节点的下一个节...原创 2019-11-19 23:30:52 · 510 阅读 · 0 评论 -
图示详解合并两个有序单链表
1、合并两个有序链表解法:因为两个链表都是有序的,可以定义一个虚拟节点,让两个链表的每个节点的数据域循环比较,不断将小的节点挂接在虚拟节点上串起一个新的链表。eg:有如下两个单链表串上第一个节点串上第二个。。。直到最后合并之后:分析:不断地通过两个指向头节点的变量遍历链表,数据域小的那个挂接在新的链表上,定义一个head始终指向新链表的头,temp指向新链表的当前最后节点。找...原创 2019-11-12 16:58:05 · 1507 阅读 · 0 评论 -
图示详解删除排序链表中的重复元素
1、删除排序链表中的重复元素解法:遍历链表将所有不重复的节点串起来形成一个新的链表eg:有如下情况的链表1、2、分析:这两个都是重复的排序链表,值得注意的是重复可能有多个,并且如果尾节点也是重复的,要考虑到尾节点的处理。详细解法:定义变量:node(来挂接所有不重复的节点)temp(始终指向node的尾节点,也就是下一个节点要尾插的前驱)cur(遍历当前链表)循环...原创 2019-11-12 16:50:59 · 228 阅读 · 0 评论 -
图示详解反转单链表
1、反转一个单链表解法:可以采用循环和递归两种方式解决,这里用循环实现eg:如下有一个链表反转之后:分析:首先观察一下反转前后的链表,新的头变成了原链表的尾节点,这个过程也就是指向由变成了可以发现出现变化的是:整个链表的头节点和next域,原链表中888节点的next域保存的是001节点的地址,反转后001节点的next域保存了888节点的地址值,不断重复这个操作,并且原头节...原创 2019-11-12 11:36:21 · 160 阅读 · 0 评论