算法与数据结构

算法笔记-入门-数据结构篇

我怕爱的太早我们不能终老 提交于 2019-12-04 02:36:47
算法笔记-入门-数据结构篇 从大学毕业之后就没研究过算法,都快忘光了,现在开个新坑,从头学起算法,哈哈,希望自己能够坚持住,不过我一定可以坚持住的,我就像易筋洗髓一样,将自己全身打断,重塑自己的一切,回归初心,以一个听者的名义对待一切,因为我做的都是我自己喜欢的事儿。 基本的数据结构类型 什么是数据结构 说白了很简单,数据存计算机里,总得有个存放规律,不能乱来,就像你查字典,你可以一页一页翻着找字儿,你也可以直接按拼音跳转找字儿,这就是查字典的数据结构,数据结构就是决定 数据顺序和位置的关系 。 数据结构的子类-链表 链表,这玩意儿理解起来会抽象一些,大学课本上表示它的数据是一个线性排列的,要我说不用这么麻烦,链表其实就是一列火车,举例来说,现在有4节车厢,你必须通过一节车厢才能到下一节去,也就是说,车厢(链表)都有一个指示牌(指针),你必须一个个往下,到达下面的车厢(指向下一个地址)。 链表这玩意儿吧,慢,查东西你得一个个往下,添加,删除数据都先要改变指针。 查一个东西,拿大O表示法,它的复杂度是O(n),算是相当慢的一种算法了。 数据结构的子类-数组 数组,也是线性排列的数据结构,还记得链表么,链表是靠指针指向,告诉你我下一个老哥是谁,但是数组不一样,它是靠一个叫数组下标的东西来告诉你,我是第几个,在Python中,这玩意儿被运用在列表里,就像a = [1,2,3,4,5]

数据结构与算法之美学习笔记:第十讲

≡放荡痞女 提交于 2019-12-04 02:13:45
一、开篇问题 推荐注册返佣金的这个功能我想你应该不陌生吧?现在很多App都有这个功能。这个功能中,用户A推荐用户B来注册,用户B又推荐了用户C来注册。我们可以说,用户C的“最终推荐人”为用户A, 用户B的“最终推荐人”也为用户A,而用户A没有“最终推荐人”。 一般来说,我们会通过数据库来记录这种推荐关系。在数据库表中,我们可以记录两⾏数据,其中actor_id表示用户id,referrer_id表示推荐人id。 基于这个背景,我的问题是, 给定一个用户ID,如何查找这个用户的“最终推荐人”? 带着这个问题,我们来学习今天的内 容,递归(Recursion) 二、如何理解递归 1、电影院案例 周末你带着女朋友去电影院看电影,女朋友问你,咱们现在坐在第几排啊?电影院里面太黑了,看不清,没法数,现在你怎么办? 2、用递归解决你在第几排的问题 别忘了你是程序员,这个可难不倒你,递归就开始排上用场了: 于是你就问前面一排的人他是第几排,你想只要在他的数字上加一,就知道自己在哪一排了。 但是,前面的人也看不清啊,所以他也问他前面的人。就这样一排一排往前问,直到问到第一排的人,说我在第一排, 然后再这样一排一排再把数字传回来。直到你前面的人告诉你他在哪几排,于是你就知道答案了。 这就是一个非常标准的递归求解问题的分解过程: 去的过程叫“递”,回来的过程叫“归” 。基本上

SDUST-2017年12数据结构期末考试题(转载)

纵饮孤独 提交于 2019-12-04 01:27:05
(1)考试时长2小时,从登录时间算起,12:10结束;(2)不想结束考试,千万不要点击结束考试,否则,后果自负;(3)考试期间只能使用PTA考试客户端、C、C++软件系统,严禁打开浏览器、通讯软件以及其他软件系统;违反以上规定以及学校的考试管理规定的以作弊论处(4)编程题禁止使用STL(5)如遇系统故障举手找监考老师 判断题 1-1 图的关键路径上任意活动的延期都会引起工期的延长 1-2 所有的排序算法中,关键字的比较操作都是不可避免的 1-3 某二叉树的前序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无左孩子 1-4 折半查找的判定树一定是平衡二叉树 1-5 查找某元素时,折半查找法的查找速度一定比顺序查找法快 1-6 用邻接矩阵法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关 1-7 基于比较的排序算法中,只要算法的最坏时间复杂度或者平均时间复杂度达到了次平方级 O(N * logN) ,则该排序算法一定是不稳定的 1-8 B-树中一个关键字只能在树中某一个节点上出现,且节点内部关键字是有序排列的 1-9 采用顺序存储结构的循环队列,出队操作会引起其余元素的移动 1-10 二叉树中至少存在一个度为2的结点 单选题 2-1 下面代码段的时间复杂度是 i = 1; while( i<=n ) i=i*3; A. \({O(n)}\) B. \({O(n​2​​)

数据结构中各种树

a 夏天 提交于 2019-12-03 23:09:33
阅读目录 1. 二叉树 2. 二叉查找树 3. 平衡二叉树 3.1 平衡查找树之AVL树 3.2 平衡二叉树之红黑树 4. B树 5. B+树 6. B*树 7. Trie树   数据结构中有很多树的结构,其中包括二叉树、二叉搜索树、2-3树、红黑树等等。本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂。 回到顶部 1. 二叉树   二叉树是数据结构中一种重要的数据结构,也是树表家族最为基础的结构。 二叉树的定义: 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2 i-1 个结点;深度为k的二叉树至多有2 k-1 个结点;对任何一棵二叉树T,如果其终端结点数为n 0 ,度为2的结点数为n 2 ,则n 0 =n 2 +1。 二叉树的示例 : 满二叉树和完全二叉树:   满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上。   满二叉树的性质:   1) 一颗树深度为h,最大层数为k,深度与最大层数相同,k=h;   2) 叶子数为2 h ;   3) 第k层的结点数是:2 k-1 ;   4) 总结点数是:2 k-1 ,且总节点数一定是奇数。   完全二叉树

数据结构与算法二 - 二叉搜索树

匆匆过客 提交于 2019-12-03 20:44:55
1 概述 二叉搜索树,顾名思义,其主要目的用于搜索,它是二叉树结构中最基本的一种数据结构,是后续理解B树、B + 树、红黑树的基础,后三者在具体的工程实践中更常用,比如C++中STL就是利用红黑树做Map,B树用于磁盘上的数据库维护等,后三者均是在二叉搜索树的基础上演变而来的,理解二叉搜索树是学习后者的基础。 与基础的数据结构如链表、堆、栈等基本结构一样,学习二叉搜索树的关键是深入理解访问与操作二叉树的算法及性能分析,本文如下部分首先介绍二叉搜索树的特征;然后重点介绍二叉搜索树的遍历、查找(包括最值查找、前驱后继查找)、以及插入和删除等操作,最后简单进行分析。 2 二叉搜索树的定义及操作 二叉树很简单,表示每个节点最多有两个子节点,二叉搜索树则更作了更近一步的要求,其必须满足如下性质: 设x为二叉搜索树中的一个节点,如果y是x左子树的一个节点( 注:不是直接子节点,是左子树的所有节点 ),则y.key <= x.key;如果y是x右子树的一个节点,则y.key >= x.key 分析:二叉树本身具有固定的结构,上述规定对二叉树中节点之间的关系进行限制,即赋予了二叉树特定的语义,只要满足二叉树的这种语义,就可以直接根据二叉树结构特征更高效地进行查询搜索等操作 如下图1所示: 图1: 二叉搜索树例子 2.1 二叉搜索树的遍历 树的遍历有三种:先序遍历、中序遍历、后序遍历。 先序遍历

数据结构与算法——常用排序算法及其Java实现

邮差的信 提交于 2019-12-03 14:01:51
冒泡排序 原理: 依次比较相邻的两个数,将小数放在前面(左边),大数放在后面(右边),就像 冒泡 一样 具体操作: 第一趟,首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后,这样第一趟下来最大的数就在最后一位了。然后还是从第一个数开始重复第一趟步骤比较,但是这次不比较最后一个数了,第二趟结束后第二大的数就在倒数第二位......以此类推,直至全部排序完成。 所有代码 在这 ,关键代码如下: private static void sort(Comparable[] a) throws IllegalAccessException, InstantiationException { Object tmp; boolean noChange = false;//用来标识输入序列的排序情况, for (int i = 0;i<a.length-1 && !noChange;i++){ noChange = true;//如果某一趟没有交换,说明数据已经排好序无需再进行接下来的排序 for (int j=0;j<a.length-1-i;j++){ if(a[j].compareTo(a[j+1])>0){ tmp = a[j]; a[j] = a[j+1]; a[j+1] =

20182323 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结

荒凉一梦 提交于 2019-12-03 12:10:05
目录 学号20182323 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 结对及互评 点评模板: 点评过的同学博客和代码 学习进度条 参考资料 目录 学号20182323 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结 教材学习内容总结 第13章 查找与排序 查找 线性查找:属于无序查找算法。从序列一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。 ps:设置哨兵可提高查找效率(设第一个为哨兵,用n记录当前位置,遍历整个序列后弹出的条件为“n==0”) 二分法查找 说明:元素必须是有序的,如果是无序的则要先进行排序操作。 基本思想:用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。 查找总结: 排序 插入排序: 将待插元素,依次与已排序好的子数列元素从后到前进行比较,如果当前元素值比待插元素值大,则将移位到与其相邻的后一个位置,否则直接将待插元素插入当前元素相邻的后一位置,因为说明已经找到插入点的最终位置

20182328 2019-2020-1 《数据结构与面向对象程序设计》第八周学习总结

倖福魔咒の 提交于 2019-12-03 12:08:55
20182328 2019-2020-1 《数据结构与面向对象程序设计》第八周学习总结 教材学习内容总结 查找 查找的概念:查找是在一组项内找到指定目标或是确定目标不存在的过程 线性查找:从数组表头开始,依次将某个值与目标元素比较,最后找到目标或者目标不存在于数组中 核心代码 private static int search(int[] arr, int key) { int index = -1; int i = 0; for (int n : arr) { if (n==key){ index=i; break; } i++; } return index; } 二分查找:将表中间位置的元素与目标元素比较,如果两者相等,则查找成功;否则利用中间位置将表分成前、后两个子表,如果中间位置元素大于目标元素,则进一步查找前一子表,否则进一步查找后一子表。 核心代码 public static int search(int[] nums, int num) { int low = 0; int high = nums.length - 1; while (low <= high) { int mid = (low + high) / 2; if (num > nums[mid]) { low = mid + 1; } else if (num < nums[mid]) { high =

20182318 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结

吃可爱长大的小学妹 提交于 2019-12-03 12:03:24
20182318 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结 教材学习内容总结 查找 线性查找 二分查找 排序 选择排序 插入排序 冒泡排序 快速排序 归并排序 分析查找和排序算法 比较查找算法 线性时间复杂度O(n) 二分查找有对数阶的复杂度,对于大的查找池来说,这非常有效率 比较排序算法 f(n)= (n-1)(一个常数n + 另一个常数)=an^2+bn+c 其中a,b,c等常数不重要,分析中只有n^2有意义 其他 快速排序,简单排序,哈希排序,归并排序等 教材学习中的问题和解决过程 问题1:为什么要设哨兵 问题1解决方案:这一过程可以使循环减少一个判断语句,循环次数多了以后就可以显著提高效率 问题2:二分查找是不是一定要比顺序查找效率更高一点呢 问题2解决方案:这个不一定,各有千秋。二分查找有它自身的限制,就是一定要在有序数组中查找,否则会出现错误. 因此应该在有序数组中使用二分查找,无序数组中使用顺序查找更好 问题3:五种排序的比较 图片 问题4:什么是算法的稳定性 问题4解决方案:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

20182326 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结

可紊 提交于 2019-12-03 11:46:10
目录 2019-2020-26 《数据结构与面向对象程序设计》第8周学习总结 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管week13 上周考试错题总结 结对及互评 点评: 点评过的同学博客和代码 其他(感悟) 学习进度条 参考资料 2019-2020-26 《数据结构与面向对象程序设计》第8周学习总结 教材学习内容总结 链表 可用对象引用变量来创建链式结构 链表由对象组成,其中每个对象指向表中的下一个对象 链表根据需要动态变大,本质上没有容量限制 修改引用的词序对链表的维护很重要 处理链表中的第一个结点通常需要特殊处理 实现带哨兵结点或虚位结点作为第一个结点的表,可以去掉处理第一个结点这种特殊情形 保存在集合中的对象不能包含所用数据结构的任何实现细节 使用链表实现栈,有效实现了相关操作的集合的任何一种实现方案都能用来解决问题 栈的链式实现方案在链表的一端添加和删除元素 查找 查找是在一组项内找到指定目标或是确定目标不存在的过程 高效的查找使得比较的次数最少 Comparable接口允许多态实现算法,而不是只应用于特定的类 排序 二分查找利用了查找池有序的这个特性 二分查找每次比较都排除了一半的可行候选数据 排序是按某种标准将一列数据按确定的次序重排的过程 选择排序算法反复的将一个个具体的值放到它最终的有序位置,从而完成一组值的排序