算法与数据结构

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

百般思念 提交于 2019-12-03 11:42:27
20182301 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结 教材学习内容总结 第十三章 查找 线性查找:依次将每个值进行查找 Comparable 接口允许多态实现算法,而不是只应用于特定的类 while (result == null&&index<data.length){ if (data[index].compareTo(target)==0) result=data[index]; index++; } 二分查找 Comparable result = null; int first = 0 ,last = data.length-1 while( result ==null && first <=last){ mid =(first + last)/2; if(data[mid].compareTo(target)==0) result=data[mid]; else if(data[mid].compareTo(target)>0) last = mid-1; else first = mid+1; } 排序 选择排序 void SelectSort(int a[],int n) //选择排序 { int mix,temp; for(int i=0;i<n-1;i++) //每次循环数组,找出最小的元素,放在前面,前面的即为排序好的 {

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

烂漫一生 提交于 2019-12-03 11:39:56
目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 学习进度条 参考资料 目录 教材学习内容总结 Chapter13 查找与排序 查找 线性查找:从表头开始,依次将每个值与目标元素进行比较。 public static<T> boolean linearSearch(T[] data,int min,int max,T target) { int index=min; boolean found=false; while(!found&&index<=max) { found=data[index].equals(target); index++; } return found; } 线性查找的平均时间复杂度为O(n)。 二分查找:在一个已排序的项目组中,从列表的中间开始查找,如果中间元素不是要找的指定元素,则削减一半查找池,从剩余一半的查找池(可行候选项)中继续以与之前相同的方式进行查找,多次循环直至找到目标元素或确定目标元素不在查找池中。 public static <T extends Comparable<T>> boolean binarysearch (T[] data, int min, int max,int mid,T target) { boolean found = false; //int mid =

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

依然范特西╮ 提交于 2019-12-03 11:32:20
学号20182329 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结 教材学习内容总结 用链表实现队列,以及队列的出入、删除、交换等等操作。 用数组实现队列,同样实现上述操作。 学习查找的ASL算法,对比出更加高效的算法,同时学会鉴别算法的稳定性。 学会最简单的线性查找,以及二分法查找。 学会在查找的基础上进行简单排排序,学会并实现选择排序。 插入排序是将元素插入已有列表。 学习冒泡排序,但是冒泡是一种算法非常复杂的。 学习快速排序和归并排序。 教材学习中的问题和解决过程啊 问题1:在学习归并查找的过程中,发现在分解和归并的每一步中度需要进行一轮比较,也就是说,在一个循环中套两个循环,但是这样的运算算法就会非常复杂,而且只是设置分解在循环中可以,但是很难把合成也放在其中。 问题1解决方法:算法本身复杂是没有解决的方法,两个循环无法并行时,可以将归并部分的代码重新设置一个方法,需要的时候调用就可以了。 问题2:在学习Android 的课程时,不是很理解和使用监听器,自己编写的监听器总是无法连接。 问题2解决方案:在实验2的学习编写中,监听器与按钮相结合的方式,连接两个活动,这当然含有点击、长按等,关键在一个监听器等待一个活动开始后,相应另一个活动,接口是必要且关键的。 问题3:我在编写书上SortPlayerList代码时,发现我设置一个inset(void

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

戏子无情 提交于 2019-12-03 11:05:44
20182328 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结 教材学习内容总结 第12章 1、算法分析的概念。 2、增长函数的概念与表示的意义。 3、算法的阶的概念与增长函数的关系。 4、比较增长函数。 5、算法复杂度的分析需要分析循环的执行情况。 6、递归程序的分析。 第14章: 1、集合的相关概念分类,以及集合和元素的关系。 2、集合的特殊例子———栈的定义和相关操作,如添加、删除、查看、判定空集或个数等。 3、(1)通过继承实现的多态来创建一个集合 (2)可以使用泛型来安全有效的保存任意对象的集合 (3)栈的ADT,特殊的java接口 4、使用栈来计算后缀表达式。 5、集合的异常 6、通过使用数组来实现栈 (1)如何创建数组对象 (2)ArrayStack类的实现以及一些具体操作 7、链式结构的基本定义和如何来创建链式结构 8、如何使用链表来进行栈的操作 9、如何使用链来实现栈 LinkedStack类是栈实现的一个重要方法 push操作 pop操作 10、如何使用java.util.Stack类来实现栈 11、包的相关介绍。 第15章 队列的相关概念以及对元素的处理方式 利用队列特性的一些方法,如编码k值、模拟票务柜台 如何使用链表来实现队列 如何基于数组来实现队列 教材学习中的问题和解决过程 问题1:链表和数组两者的相同与不同 问题1解决方案:

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

拜拜、爱过 提交于 2019-12-03 10:46:09
20182327 2019-2020-1 《数据结构与面向对象程序设计》第八周学习总结 教材学习内容总结 1、 查找算法的总结 - 线性查找,通过依次遍历所要查找元素的集合,比较是否存在所需查找的元素,直到找到该元素或返回false表明集合不存在该元素。实现较为简单,==但当集合元素数量巨大时,效率极慢==。 - - 二分法查找,通过每次将集合分为两部分,比较所需查找的元素位于中间元素的左半区还是右半区,依次进行二分,直至找到元素,或返回false。效率较高,例如,一个含义一百万元素的集合,只需20次左右即可完成查找。==但二分法的实现需要基于一个有序数组,否则无法实现。== 2、排序算法的总结 - 顺序排序——选择排序法,选择排序法每遍历列表依次,找到当前最小元素,将其与列表左侧元素交换,最终将所有元素进行排序。 - - 顺序排序——插入排序法,从最左侧元素开始,与其余元素比较,产生一个初步的排序子集,每当下一个比较的元素小于排序子集的最右元素时,经过与子集元素比较,将其插入到子集的顺序位置。子集不断向右与剩余元素进行比较,直至完成排序。 - - 顺序排序——冒泡排序,将列表中的元素,从左端开始,两个元素比较大小,若左大右小,两个交换位置,一直往复,将最大元素置于最右位置。每次排序都将当前最大的交换到最右 - 快速排序,使用递归的思想。以一个元素为界限,小在左,大在右

go map数据结构和源码详解

白昼怎懂夜的黑 提交于 2019-12-03 10:26:23
目录 1. 前言 2. go map的数据结构 2.1 核心结体体 2.2 数据结构图 3. go map的常用操作 3.1 创建 3.2 插入或更新 3.3 删除 3.4 查找 3.5 range迭代 3.5.1 初始化迭代器mapiterinit() 3.5.2 迭代过程mapiternext() 4. go map的扩容缩容 4.1 扩容缩容的基本原理 4.2 为什么叫“伪缩容”?如何实现“真缩容”? 5 Q&A关键知识点 5.1 基本原理 5.2 时间复杂度和空间复杂度分析 1. 前言 本文以go1.12.5版本分析,map相关的源码在runtime包的map开头的几个文件中,主要为map.go。 go的map底层实现方式是hash表(C++的map是红黑树实现,而C++ 11新增的unordered_map则与go的map类似,都是hash实现)。go map的数据被置入一个由桶组成的有序数组中,每个桶最多可以存放8个key/value对。key的hash值(32位)的低阶位用于在该数组中定位到桶,而高8位则用于在桶中区分key/value对。 go map的hash表中的基本单位是桶,每个桶最多存8个键值对,超了,则会链接到额外的溢出桶。所以go map是基本数据结构是hash数组+桶内的key-value数组+溢出的桶链表 当hash表超过阈值需要扩容增长时

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

廉价感情. 提交于 2019-12-03 10:12:49
目录 教材学习内容总结 教材第12章 教材第14章 教材第15章 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 2 结对及互评 点评过的同学博客和代码 感悟 学习进度条 参考资料 正文 20182311 2019-2020-1 《数据结构与面向对象程序设计》第7周学习总结 教材学习内容总结 教材第12章 算法效率可以用问题大小(n)和及处理步骤来定义。增长函数表示问题大小与希望优化的值之间的关系,该函数表示算法的时间或空间利用率。 我们更关心算法的渐进复杂度,用来表示增长函数的一半特性。渐进复杂度称为算法的阶,用O表示,括号里放的是函数的主项,即增长最快的一项。 处理器速度和内存不能弥补算法效率的差异,所以如果算法效率不高,处理器速度的提高没有效果。 计算调用方法和循环的阶,分别求再相乘。 教材第14章 集合:收集并组织其他对象的对象,定义访问了访问及管理集合元素的方法。分为线性集合和非线性集合。集合元素之间的组织方式有加入次序和固有关系决定。 抽象数据类型是取值和操作都没有在语言中定义的一种数据类型。集合就是一个抽象名称。泛型是指保存、操作并管理指导实例化时才确定的类型的对象。 栈集合(LIFO原则,先进后厨) 用数组实现栈:利用数组实现栈会出现假溢出的问题,对于数组实现栈的管理容量办法可以定义一个自动扩容方法(声明一个更大数组来存放栈的值)。对数组来说

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

给你一囗甜甜゛ 提交于 2019-12-03 10:12:27
目录 [toc] 学号20182323 2019-2020-1 《数据结构与面向对象程序设计》第7周学习总结 教材学习内容总结 第12章 算法分析 什么叫做算法:是对特定问题求解方法,或者说是步骤的一种描述。 什么叫做好算法(具有以下标准): 正确性 可读性 健壮性 通用性 效率与储存空间需求 冰与火之歌:【时间】与【空间】复杂度 时间复杂度:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。 算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模的增大,算法执行时间的增长率和f(n)的增长率相同,称为算法的渐进复杂度,简称为时间复杂度。 其中f(n)是问题规模n的某个函数。这样用大写 O() 来体现算法时间复杂度的记法,我们称为大O记法 常见的时间复杂度如下图所示: 每个复杂度的时间比如下图所示: 第14章 栈 什么是栈:栈是一个有序集合,其中添加和删除元素都是发生在同一端,通常称作发生操作的这一端为顶部,对应的端为底部。(先进后出) 栈的操作: 利用栈完成后缀表达式的计算:后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。利用栈结构

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

泪湿孤枕 提交于 2019-12-03 10:08:26
目录 20182306 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 结对及互评 评分标准 点评模板: 点评过的同学博客和代码 其他(感悟、思考等,可选) 学习进度条 参考资料 20182306 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结 教材学习内容总结 · 时间复杂度:增长函数与大O符号。增长函数表明问题大小(n)与希望优化的值之间的关系。该函数表示时间复杂度或空间复杂度。渐进复杂度称为算法的阶。记为O(n) · 时间复杂度越低,程序运行效率越高。时间复杂度的计算可通过寻找运行次数最多的程序,计算他的运行次数,取n的最高次方的极数,即为程序的时间复杂度 · 栈可以理解为一类数据的集合,栈中的元素可以写入,也可以读出。元素存在先后次序。先入栈的先被读出。栈可用数组,链表两种形式实现。 · 有push,pop,peek,isempty,size等常用操作 · 链式结构是基于数组的集合实现的主要代替方案,链表是一种链式结构,自引用式构成了链表的基础,在链表中存储的对象通常泛称为结点node · 队列是一种线性集合,元素从一段加入从另一端删除(先进先出)。 · 队尾(tail),队首(head),队列前端(front),队列末端

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

和自甴很熟 提交于 2019-12-03 09:58:24
20182309 2019-2020-1 《数据结构与面向对象程序设计》第7周学习总结 教材学习内容总结 12 算法分析 算法效率 增长函数及比较 循环、递归的效率 14 栈 先进后出的集合 push加入元素到顶端 pop删除并返回顶端元素 peek查看但不删除顶端元素 isEmpty判断栈是否为空 size判断栈中元素个数 输出全栈时会按进入顺序输出 用数组实现栈 用链表实现栈 15 队列 先进先出的集合 enqueue入队 dequeue出队 first显示队首 isEmpty是否为空 size元素个数 用数组实现队列 用链表实现队列 教材学习中的问题和解决过程 问题1:数组实现队列时,数组会越来越大 问题1解决方案:使用环形数组,数组大小固定,头尾相连。 问题2:泛型T和E的区别 问题2解决方案: E-Element在集合中使用,因为集合中存放的是元素;一般使用 来声明类型持有者名称。自定义泛型类时,类持有者名称可以使用T(Type) 如果是容器的元素可以使用E(Element) 代码调试中的问题和解决过程 问题1:当头尾重合时,有满和空两种情况 问题1解决方案:判断最后一步做的是出队还是入队,设一个flag与isEmpty一起判断。 代码托管 结对及互评 代码中值得学习的或问题: 提出与课本不同的方法解决问题 基于评分标准,我给本博客打分:11分。得分情况如下: