二分查找

跟我又是栈又是堆又是树又是图的,问你什么是数据结构,你咋还不会说了呢?

感情迁移 提交于 2019-12-03 22:39:05
【一】、什么是数据结构 前言 其实说实话,大一刚来的时候就学了数据结构,当时学的数据结构是下面图片中的这一本,不过说来惭愧,当时由于入门时C语言学的太菜,以至于开这门课的时候思维跟不上就抵触,不用解释,就是给自己找借口,坦白说吧,就是没好好学,不过人非圣贤,孰能无过,人生难免会犯点错,及时改正还是个好孩子,因此,我决定把之前没学好的数据结构重新补回来。 对数据结构的理解 首先从定义上来说的话,好像对数据结构没有什么一个统一的、标准的答案,我找了好几本书,挑了一个我认为还计较好理解的定义: 数据结构是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最优效率的算法。 如果你没接触过数据结构,你看了定义能看懂吗?如果你能看懂,我很佩服你,我反正是不行,不过现在因为接触的东西比较多,听得多了,看了也能理解。我觉得对于新手,应该先让新手去理解,等有了自己的理解之后再看官方定义的话,效果会比较好,反正我是这么认为的。我用生活中的例子来解释什么是数据结构吧: 举例:如何在书架上摆放图书? 也就是说,现在有一些书架,还有一堆图书,你要怎样把它们放到书架上去呢?换言之说,有一堆数据,给了你一些存储空间,你要怎么把这些数据存起来呢? 其实这个问题问的不科学,因为你不知道所谓的书架是长什么样,可能是下面图片中的任意一种。 所以你就知道了,当有人问你一个数据怎么组织的时候

python基础--二分查找

元气小坏坏 提交于 2019-12-03 15:09:41
# 二分查找def sort_search(lst,key): """ 二分查找 :param lst: 有序数列 :param key: 要查找的关键值 :return: key在数列中的索引 """ low, high = 0, len(lst)-1 while low < high: mid = (low + high)//2 if lst[mid] < key: low = mid + 1 elif lst[mid] > key: high = mid - 1 else: return mid return Nonel = [1, 2, 3, 4, 5, 6, 7, 8, 9]print('key index:',sort_search(l,80)) 来源: https://www.cnblogs.com/jeffrey04118110/p/11801665.html

20182315 第八周学习总结

走远了吗. 提交于 2019-12-03 12:03:43
学号 2019-2020-1 《数据结构与面向对象程序设计》第八周学习总结 教材学习内容总结 线性查找:可设置哨兵,将a[0]设成需要找的值,每一个元素和哨兵进行比对,可优化程序。 二分查找:二分查找的优势在于每次查找都可排除上次查找后一半的元素,极大加快查找速率。但二分查找需让数组排序,按顺序查找。 选择排序:通过二重循环,每一次找出符合条件的最值元素,将此元素放在首位。 插入排序:插入排序为依次排序,即将现插入的数字排号,以后插入的数字都在前面的排序里找到合适的位置,也采用二重循环,与选择排序相似。 冒泡排序:与之前学过的C语言相同,一次循环,经过n次比较,确定一个最值,放在开头或结尾。 快速排序:对目标进行多次分块排序,每次应用于左右两个划分快,直到每个人划分快只包含一个元素。代码中用到递归语句,if划分块中元素不多于一个时,停止递归。内层递归中,从划分块两端向中间查找,遇到错排的两个元素,交换其位置,知道left和right指针相遇时停止。递归使程序无线分裂成两个程序,直到停止为止。排序核心为:一次排序确定一个元素的位置。 归并排序:先将数表拆成几个长度为1或2的子表,再将子表排序。 教材学习中的问题和解决过程 问题1:归并排序的实现原理不够清晰,不理解几次分块后如何排序?。 问题1解决办法:相比于快速排序一次确定一个元素的位置,归并排序排的是元素块的位置,接收三个参数

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]之前,则称这种排序算法是稳定的;否则称为不稳定的。

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++) //每次循环数组,找出最小的元素,放在前面,前面的即为排序好的 {

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

拜拜、爱过 提交于 2019-12-03 11:16:26
目录 20182324 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 结对及互评 点评: 点评过的同学博客和代码 其他(感悟、思考等,可选) 学习进度条 参考资料 20182324 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结 教材学习内容总结 1、查找 查找是在一组数据项内找到指定目标或是确定目标不存在的过程。 线性查找 二分查找 二分查找利用了查找池有序的特性,同时也要求表必须是有序的。相比于线性查找,二分查找更加高效。 哈希查找 通过存储不同的哈希值来确定元素的位置 2、排序 排序是按某种标准将一列数据项按确定的次序重排的过程。 选择排序 反复地将一个个具体的值放到它最终的有序位置,从而完成排序。 插入排序 反复地将一个个具体的值插入到表的已有序子表中,从而完成排序。 冒泡排序 反复地比较两个相邻元素,如果必要就交换次序,从而完成排序。 快速排序 通过划分子表,递归地对两个子表进行排序,从而完成排序。关键是要选择一个好的划分元素。 归并排序 递归地将表平分为两部分,直到每个子表中只含一个元素,将这些表归并为有序表,从而完成排序。 教材学习中的问题和解决过程 问题1:参考书上代码编写的程序运行时没有标题栏 问题1解决方案:主类

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) {

leetcode中二分查找的具体应用

不羁的心 提交于 2019-12-03 10:01:58
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: [-1,-1] 思路: 一看到算法时间复杂度必须是 O (log n ) 级别,肯定想到是二分法。但这里二分法需要变换一下:设置左右两个指针进行二分法,当通过二分法搜寻到目标值时,左右指针合一,然后在合一的位置上分别向左向右遍历寻找是否还有和目标值相等的数. def test(array,target): if len(array)==0: return [-1,-1] elif target<array[0] or target>array[-1]: return [-1,-1] else: l,r = 0,len(array)-1 while l<=r: mid = (l+r)//2 if target<array[mid]: r = mid-1 elif target>array[mid]: l = mid + 1 else: l,r=mid,mid while

查找算法总结

﹥>﹥吖頭↗ 提交于 2019-12-03 09:43:05
查找算法:顺序查找、二分查找、分块查找、二叉查找树、B树、B+树 一、二分查找(常规) 题目描述: (牛客网http://www.nowcoder.com/practice/28d5a9b7fc0b4a078c9a6d59830fb9b9?rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking) 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组 A 及它的大小 n ,同时给定要查找的元素 val ,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。 若该元素出现多次,请返回第一次出现的位置 。 测试样例: [1,3,5,7,9],5,3 返回:1 public class BinarySearch { public int getPos(int[] A, int n, int val) { // write code here //递归实现 //return binarySearch(A, val, n, 0); //非递归实现 return binarySearch2(A, val, n); } //递归实现 public int binarySearch(int[] pA, int pval, int high, int low){ int