查找算法

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

20182310第八周学习总结

眉间皱痕 提交于 2019-12-03 10:45:27
20182310 2019-2020-1 《数据结构与面向对象程序设计》第八周学习总结 教材学习内容总结 1.泛型 之前涉及过通过继承实现多态,而Object则是所有类型的父类,因此只要将一个数组指向Object类型,那么该数组理论上就可以保存所有类型的数据了,这是一种极端情况 但是,当使用了Object后,容易出现兄弟类型之间转换的问题,编译不会报错,但是运行时会出错。 泛型:可以定义一个类,可以保存数据及操作,但只有当实例化时才确定类型(一般用T来表示泛型) class Box { T类型对象的声明与操作代码 } 当要使用Box定义的数据时,通过实例化来实现它的具体类型,来替代T Box box1=new Box ; Box box2=new Box ; ... 2.线性查找法 线性查找法就是从头开始查找,与每一个列表中的元素进行比较,直到找到该目标元素或查找到末尾还没找到。 以下的方法实现了一个线性查找。该方法返回一个布尔值,若是true,便是找到该元素,否则为false,表示没找到。 public static boolean linearSearch(T[] data, int min, int max, T target) { int index = min; boolean found = false; while (!found && index <= max) {

第八周

帅比萌擦擦* 提交于 2019-12-03 10:13:19
学号 2019-2020-20182321 《数据结构与面向对象程序设计》第八周学习总结 教材学习内容总结 查找中最简单的查找就是线性查找了,也就是对一列元素一个一个的向下寻找,找到了再返回,线性查找中其实可以利用哨兵法来简化线性查找的过程。 简化查找的方法有二分查找,二分查找可以极大的减小算法的时间复杂度,但是缺点是其查找的内容必须是已经排序好的,对于那种不排序的杂乱的线性集合,二分查找法不适用,必须要先排序再查找。 除了以上的两种方法,我们其实还另外学了三种,哈希线性查找、哈希链表查找、二叉树查找,他们三个的查找方法我觉得都比以上查找快得多,但是前提是其必须要按照一定的要求将其进行排序,形成一个集合。 哈希就是找出每个单个元素与所在节点的关系,利用这层关系,我们对其进行区域性查找 二叉树查找就是利用链表形成一个二叉树,比父节点大的在右边,比父节点小的在左边,查找时顺着二叉树向下查找。 排序方面,最简单的两个也是我们在c语言里学的选择排序和冒泡排序,选择排序就是找出最大或者最小的元素依次放在数列的最左边,冒泡排序是两两进行比较,找出第一轮比较和后面几轮比较次数之间的关系,其效果就像是水池里的泡泡一样,小的或者大的数字会一点一点的向最上边移动 -插入排序就是将队列里一个又一个的值,插入到已经排序的子序列,如下面序列 20 18 23 21 20 19 11 02 21 14 55

C++ STL——string和vector

核能气质少年 提交于 2019-12-03 09:36:52
目录 一 STL基本概念 二 string容器 三 vector容器 3.1 vector动态增长原理 3.2 vector构造函数 3.3 vector常用赋值操作 3.4 vector大小操作 3.5 vector数据存取操作和插入删除 3.6 使用swap()收缩空间 3.7 使用reserve()预留空间提高程序效率 注:原创不易,转载请务必注明原作者和出处,感谢支持! 注:内容来自某培训课程,不一定完全正确! 一 STL基本概念 STL(Standard Template Library)标准模板库,最早是惠普实验室开发的一系列软件的统称,现在主要出现在C++中,但是在引入C++之前该技术已经存在很长的时间了。 STL从广义上分为:容器(container),算法(alogrithm)和迭代器(iterator)。容器和算法之间通过迭代器进行无缝连接。STL几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。 在C++标准库当中,隶属于STL的占到了80%以上。在C++标准库中,STL被组织成以下13个头文件: <algorithm> <deque> <functional> <iterator> <vector> <list> <map> <memory> <numeric> <queue> <set> <stack>

1031 笔记

拟墨画扇 提交于 2019-12-03 07:32:51
目录 pymysql 1.基本操作 1.新建表 2.增加数据 3.删除数据 4.更改数据 5.查找数据 6.断开连接 2.sql注入 解决方法 3.创建大数据库 索引 定义 作用 实现原理 B+树的性质 B+树的分类 InnoDB存储引擎表示索引组织表,即表中数据按照主键顺序存放。而聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,同时叶子结点存放的即为整张表的行记录数据,也将聚集索引的叶子结点称为数据页。聚集索引的这个特性决定了索引组织表中数据也是索引的一部分。同B+树数据结构一样,每个数据页都通过一个双向链表来进行链接。 如果未定义主键,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使用它作为聚簇索引。 如果没有这样的列,InnoDB就自己产生一个这样的ID值,它有六个字节,而且是隐藏的,使其作为聚簇索引。 由于实际的数据页只能按照一棵B+树进行排序,因此每张表只能拥有一个聚集索引。在多少情况下,查询优化器倾向于采用聚集索引。因为聚集索引能够在B+树索引的叶子节点上直接找到数据。此外由于定义了数据的逻辑顺序,聚集索引能够特别快地访问针对范围值得查询。 索引的种类 主键索引 primary key 唯一索引 unique(name) 唯一联合索引 uniqe (name, email) 普通索引

3、分块查找——查找算法

六月ゝ 毕业季﹏ 提交于 2019-12-03 06:33:56
2019/11/02 3、分块查找 (又称 索引顺序查找)[性能介于 顺序查找 和 折半查找之间] 索 引 表 最大关键字 22 48 86 起始地址 1 7 13 22 12 13 8 9 20 3 3 42 44 38 24 48 60 58 74 49 86 53 表及其索引表 3、分块查找 (又称 索引顺序查找)[性能介于 顺序查找 和 折半查找之间] 索 引 表 最大关键字 22 48 86 起始地址 1 7 13 22 12 13 8 9 20 3 3 42 44 38 24 48 60 58 74 49 86 53 表及其索引表 来源: https://www.cnblogs.com/LinQingYang/p/11780770.html

2、折半查找——查找算法

北城余情 提交于 2019-12-03 06:32:49
2019/11/02 2、折半查找 ( 折半查找效率比顺序查找效率高 ,但折半查找只适用于 有序表 ,且限于 有序结构 ) 要求: 1.线性表必须采用 顺序存储结构。 2.表中元素按关键字有序排列。 算法描述: [时间复杂度:O(log 2 n) ] int Search_Bin(SSTable ST, KeyTable key){ int low = 1,mid; int high = ST.length; while(low<=high){ mid = (low+high) / 2; if(key==ST.R[mid].key) return mid; //找到待查元素 else if(key<ST.R[mid].key) high=mid-1; //继续在前一子表进行查找 else low=mid+1;//继续在后一子表进行查找 } return 0; //表中不存在待查元素 } 折半查找递归算法: int Search_bin(SSTable ST, KeyType key, int low_in, int high_in){ int low = low_in; int high = high_in; int mid=mid = (low+high) / 2; while(low<=high){ if(key==ST.R[mid].key) return mid; /

1、顺序查找——查找算法

瘦欲@ 提交于 2019-12-03 06:30:34
2019/11/02 1、顺序查找(从前往后||从后往前查) 数据元素定义: typedef struct{ Keytype key; //关键字域 InfoType otherinfo;//其他域 }Elemtype; 顺序表定义: typedef struct{ Element *R; //存储空间基地址 int length; //当前长度 }SSTable; 算法1顺序查找: [时间复杂度:O(n)] int Search_Seq(SSTable ST,KeyType key){ for(i=ST.length;i>=1;--i)   if(ST.R[i].key==key) return i; //从后往前找 return 0; } 算法2设置监视哨的顺序查找: [时间复杂度:O(n)] int Search_Seq(SSTable ST,Keytype key){ ST.R[0].key=key; //"哨兵",也可以放在高下标处 for(i=ST.length; ST.R[i]!=key; --i); //从后往前找 return i; } "哨兵"的使用,能使顺序查找在ST.length≥1000时,进行一次查找所需的平均时间几乎减少一半。 顺序查找 优点 : 算法简单,对表结构无要求,既适用于顺序结构,又适用于链式结构,无论记录是否按关键字有序 均可使用。

【经典数据结构】B树与B+树

大城市里の小女人 提交于 2019-12-03 04:42:20
维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化 大块数据的读和写操作 。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在 数据库 和 文件系统 。” 定义 B 树 可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。 根节点至少有两个子节点 每个节点有M-1个key,并且以升序排列 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间 其它节点至少有M/2个子节点 下图是一个M=4 阶的B树: 可以看到B树是2-3树的一种扩展,他允许一个节点有多于2个的元素。 B树的插入及平衡化操作和2-3树很相似,这里就不介绍了。下面是往B树中依次插入 6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4 的演示动画: B+ 树是对B树的一种变形树,它与B树的差异在于: 有k个子结点的结点必然有k个关键码; 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。