查找算法

【数据结构】---线性表

℡╲_俬逩灬. 提交于 2020-02-05 19:57:44
目录 线性表的定义和特点 线性表的顺序表示和实现 线性表的顺序存储表示 顺序表中基本操作的实现 1. 初始化 2. 取值 3. 查找 4. 插入 5. 删除 线性表的定义和特点 线性表属于线性结构。 线性结构的基本特点是除第一个元素无直接前驱,最后一个元素无直接后继之外,其他每个元素都有一个前驱和后继。 同一线性表中的元素必定具有相同的特性,即属于同一数据对象,相邻数据元素之间存在着序偶关系。 由 \(n (n \geq 0)\) 个数据特性相同的元素构成的有限序列称为 线性表 。线性表中元素的个数 \(n (n \geq 0)\) 定义为线性表的长度, \(n = 0\) 时称为空表。 线性表的顺序表示和实现 线性表的顺序存储表示 线性表的顺序表示是指用一组地址连续的存储单元一次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构,称这种存储结构的线性表为**顺序表 (Sequential List)。逻辑上相邻的元素,物理次序也是相邻的。 线性表的第一个数据元素的存储位置,通常称作线性表的起始位置或 基地址 。线性表的顺序存储结构是一种 随机存取 的存储结构。 通常使用数组来描述数据结构中的顺序存储结构,由于线性表的长度可变,在C语言中可用动态分配的一维数组表示线性表,描述如下: // ----------顺序表的存储结构---------- #define MAXSIZE

树据结构与算法——二分搜索树 动画演示

…衆ロ難τιáo~ 提交于 2020-02-05 19:05:18
文章目录 一、二分查找法 二分查找法变变种:floor和ceil 二、二分搜索树 实现查找表的比较: 二分搜索树定义 插入元素 查找元素 三、二分搜索树的遍历 二分搜索树的遍历(深度优先遍历) 二分搜索树的层序遍历(广度优先遍历) 四、二分搜索树删除节点 删除最大值,最小值 删除任意节点 附录   二叉搜索树是用来解决查找问题的,在介绍二叉搜索树之前,先学习二分查找法。 一、二分查找法   二分查找法只能对于 有序数列 使用(排序后的数组),在中间找一个元素v如果不是v,这在<v和>v两部分查找,时间复杂度为O(logn),如下图所示: 二分查找代码: // 二分查找法,在有序数组arr中,查找target // 如果找到target,返回相应的索引index // 如果没有找到target,返回-1 template < typename T > int binarySearch ( T arr [ ] , int n , T target ) { // 在arr[l...r]之中查找target int l = 0 , r = n - 1 ; while ( r > l ) { //int mid = (l + r)/2; // 防止极端情况下的整形溢出,使用下面的逻辑求出mid int mid = l + ( r - l ) / 2 ; //如果刚好找到 if ( arr [

最小生成树之克鲁斯卡尔(Kruskal)算法

百般思念 提交于 2020-02-05 16:54:56
学习最小生成树算法之前我们先来了解下 下面这些概念: 树 (Tree):如果一个无向连通图中不存在回路,则这种图称为树。 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的所有顶点的树,则该子图称为G的生成树。 生成树是连通图的极小连通子图。这里所谓极小是指:若在树中任意增加一条边,则将出现一条回路;若去掉一条边,将会使之变成非连通图。 最小生成树 (Minimum Spanning Tree,MST):或者称为最小代价树Minimum-cost Spanning Tree:对无向连通图的生成树,各边的权值总和称为生成树的权,权最小的生成树称为最小生成树。 构成生成树的准则有三条: <1> 必须只使用该网络中的边来构造最小生成树。 <2> 必须使用且仅使用n-1条边来连接网络中的n个顶点 <3> 不能使用产生回路的边。 构造最小生成树的算法主要有:克鲁斯卡尔(Kruskal)算法和普利姆(Prim)算法他们都遵循以上准则。 接下分别讨论一下这两种算法以及判定最小生成树是否唯一的方法。 克鲁斯卡尔算法 克鲁斯卡尔算法的基本思想是以边为主导地位,始终选择当前可用(所选的边不能构成回路)的最小权植边。所以Kruskal算法的第一步是给所有的边按照从小到大的顺序排序。这一步可以直接使用库函数qsort或者sort。接下来从小到大依次考察每一条边(u,v)。

实验五

吃可爱长大的小学妹 提交于 2020-02-05 04:49:44
1.二分查找 ex1_1.cpp代码如下: // 练习:使用二分查找,在一组有序元素中查找数据项 // 形参是数组,实参是数组名 #include <stdio.h> const int N=5; int binarySearch(int x[], int n, int item); int main() { int a[N]={3,23,56,78,1000}; int i,index, key; printf("数组a中的数据:\n"); for(i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); printf("输入待查找的数据项: "); scanf("%d", &key); index=binarySearch(a,N,key);// 调用函数binarySearch()在数组a中查找指定数据项item,并返回查找结果给index // 补足代码① // ××× if(index>=0) printf("%d在数组中,下标为%d\n", key, index); else printf("%d不在数组中\n", key); return 0; } //函数功能描述: //使用二分查找算法在数组x中查找特定值item,数组x大小为n // 如果找到,返回其下标 // 如果没找到,返回-1 int binarySearch(int x

实验五

落花浮王杯 提交于 2020-02-05 04:48:54
part1 二分法查找 // 练习:使用二分查找,在一组有序元素中查找数据项 // 形参是数组,实参是数组名 #include <stdio.h> const int N=5; int binarySearch(int x[], int n, int item); int main() { int a[N]={1,3,9,16,21}; int i,index, key; printf("数组a中的数据:\n"); for(i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); printf("输入待查找的数据项: "); scanf("%d", &key); // 调用函数binarySearch()在数组a中查找指定数据项item,并返回查找结果给index // 补足代码① // ××× index=binarySearch(a,N,key); if(index>=0) printf("%d在数组中,下标为%d\n", key, index); else printf("%d不在数组中\n", key); return 0; } //函数功能描述: //使用二分查找算法在数组x中查找特定值item,数组x大小为n // 如果找到,返回其下标 // 如果没找到,返回-1 int binarySearch(int x[], int n,

Mysql 索引

好久不见. 提交于 2020-02-05 02:07:38
一. 存储引擎 1. 什么是存储引擎? 与其他数据库例如Oracle 和SQL Server等数据库中只有一种存储引擎不同的是,MySQL有一个被称为“Pluggable Storage Engine Architecture”(可替换存储引擎架构)的特性,也就意味着MySQL数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。MySQL数据库在实际的工作中其实分为了语句分析层和存储引擎层,其中语句分析层就主要负责与客户端完成连接并且事先分析出SQL语句的内容和功能,而存储引擎层则主要负责接收来自语句分析层的分析结果,完成相应的数据输入输出和文件操作。简而言之,就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。 2. 存储引擎种类 存储引擎 说明 MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务 InnoDB 5.5版本后MySQL的默认数据库,支持事务和行级锁定,比MyISAM处理速度稍慢 ISAM MyISAM的前身,MySQL5.0以后不再默认安装 MRG_MyISAM(MERGE) 将多个表联合成一个表使用,在超大规模数据存储时很有用 Memory 内存存储引擎

数据结构与算法——顺序查找 、折半查找(也称二分查找) 、索引查找

落花浮王杯 提交于 2020-02-05 01:53:06
目录: 一、查找的相关概念 二、顺序查找 三、折半查找(也称二分查找) 四、索引查找 五、三种查找算法比较 一、查找的相关概念 1、关键字 查找过程中,往往是依据数据元素的某个数据项进行查找,这个数据项通常是数据的关键字。 关键字 :是数据元素中某个数据项的值,用以标识一个数据元素。 若关键字能标识唯一的一个数据元素,则称谓 主关键字 。 若关键字能标识若干个数据元素,则称谓 次关键字 。 例如:张三 2016010002 男 成都 1.75(主关键字是2016010002,次关键字是张三) 2、平均查找长度 ASL ASL=P 1 C 1 +P 2 C 2 +…+P n C n P i ——查找第i个元素的概率 C i ——查找第i个元素需要的比较次数 3、常见的查找算法 顺序查找 二分查找 索引查找 哈希查找 二、顺序查找 1、顺序查找基本思想 从表中指定位置(一般为最后一个,第0个位置设为岗哨)的记录开始,沿某个方向将记录的关键字与给定值相比较,若某个记录的关键字和给定值相等,则查找成功; 反之,若找完整个顺序表,都没有与给定关键字值相等的记录,则此顺序表中没有满足查找条件的记录,查找失败。 int seqsearch ( DataType R [ ] , KeyType key ) { R [ 0 ] . key = key , i = n ; while ( R [ i

Java查找算法

别来无恙 提交于 2020-02-04 20:36:54
查找算法 一、概述 顺序(线性)查找 二分查找(折半查找) 插值查找 斐波那契查找 二、线性查找 说明 : 找到元素返回下标,若没有找到则返回-1 此处找到一个满足要求的就返回 /** * @author DELL * @Date 2020/2/3 17:53 **/ public class SequenceSearch { public static void main ( String [ ] args ) { int [ ] arr = { 3 , 67 , 2 , 0 , 9 , 56 , 35 } ; int index = seqSearch ( arr , 0 ) ; if ( index == - 1 ) { System . out . println ( "没有此元素!" ) ; } else { System . out . println ( "该元素下标为:" + index ) ; } } /** * 找到一个满足要求的就返回下标,否则返回-1 * * @param arr * @param value * @return */ public static int seqSearch ( int [ ] arr , int value ) { for ( int i = 0 ; i < arr . length ; i ++ ) { if (

算法与数据结构2

时光总嘲笑我的痴心妄想 提交于 2020-02-03 13:47:28
算法与数据结构02-线性查找和二分查找(队列和栈) 线性查找 :顺序查找,速度较慢 package com . kele ; import java . sql . SQLOutput ; import java . util . Arrays ; /**队列: 先进先出 * @author 12402 */ public class MyQueue { private int [ ] arr ; public MyQueue ( ) { arr = new int [ 0 ] ; } // 往队列中添加元素 public void add ( int target ) { int [ ] newArr = new int [ arr . length + 1 ] ; for ( int i = 0 ; i < arr . length ; i ++ ) { newArr [ i ] = arr [ i ] ; } newArr [ newArr . length - 1 ] = target ; arr = newArr ; } // 展示队列元素 public void show ( ) { System . out . println ( Arrays . toString ( arr ) ) ; } // 取出最先静茹的元素 public int pop ( ) { int

二分查找算法

旧时模样 提交于 2020-02-03 03:08:29
我们在写程序的时候,经常会遇到这样一类问题:在一个数组中查找一个数是不是存在。比如在下图的数组中,查找8是不是存在: 如果不要求效率,我们最一般的查找方法就是顺序查找,依次查看a[0], a[1], …, a[n-1],检查是不是等于8。这样对于长度为n的数组,平均查找长度是n/2。 如果数组是有序的,比如是递增的,就像上图[1, 2, 3, 4, 5, 7, 8, 10, 11, 13]一样的话。我们就有效率更高的查找算法,叫做二分查找。例如还是在上面数组中查找8: 二分查找会这么进行:我们面对的数组是a[0]-a[9],第一步:我们直接找位于中间的数a[4],发现a[4]=5。我们要找的数是8,比5大,所以我们知道如果8在数组里,那它肯定在a[5]~a[9]这几个数的范围里。 第二步:我们找a[5]-a[9]这个范围里位于中间的数a[7],发现a[7]=10,比我们要找的8大。所以我们知道如果8在数组里,那它肯定在a[5]~a[6]这几个数的范围里。 第三步:我们找到a[5]-a[6]这个范围里位于中间的数a[5],发现a[5]=7,比我们要找的8小。所以我们知道如果8在数组里,那它肯定是a[6]这个数。 第四步也是最后一步。我们查看a[6]的值,发现a[6]=8,于是我们找到了8的位置。假如我们这时发现a[6]不是8,则说明8没有在这个数组里。 二分查找又叫“折半查找”