索引顺序查找
- 格式:doc
- 大小:70.00 KB
- 文档页数:9
使⽤索引为什么能提⾼查询速度?为什么能够提⾼查询速度?索引就是通过事先排好序,从⽽在查找时可以应⽤⼆分查找等⾼效率的算法。
⼀般的顺序查找,复杂度为O(n),⽽⼆分查找复杂度为O(log2n)。
当n很⼤时,⼆者的效率相差及其悬殊。
举个例⼦:表中有⼀百万条数据,需要在其中寻找⼀条特定id的数据。
如果顺序查找,平均需要查找50万条数据。
⽽⽤⼆分法,⾄多不超过20次就能找到。
⼆者的效率差了2.5万倍!在⼀个或者⼀些字段需要频繁⽤作查询条件,并且表数据较多的时候,创建索引会明显提⾼查询速度,因为可由全表扫描改成索引扫描。
(⽆索引时全表扫描也就是要逐条扫描全部记录,直到找完符合条件的,索引扫描可以直接定位)不管数据表有⽆索引,⾸先在SGA的数据缓冲区中查找所需要的数据,如果数据缓冲区中没有需要的数据时,服务器进程才去读磁盘。
1、⽆索引,直接去读表数据存放的磁盘块,读到数据缓冲区中再查找需要的数据。
2、有索引,先读⼊索引表,通过索引表直接找到所需数据的物理地址,并把数据读⼊数据缓冲区中。
索引有什么副作⽤吗?索引是有⼤量数据的时候才建⽴的,没有⼤量数据反⽽会浪费时间,因为索引是使⽤⼆叉树建⽴.当⼀个系统查询⽐较频繁,⽽新建,修改等操作⽐较少时,可以创建索引,这样查询的速度会⽐以前快很多,同时也带来弊端,就是新建或修改等操作时,⽐没有索引或没有建⽴覆盖索引时的要慢。
索引并不是越多越好,太多索引会占⽤很多的索引表空间,甚⾄⽐存储⼀条记录更多。
对于需要频繁新增记录的表,最好不要创建索引,没有索引的表,执⾏insert、append都很快,有了索引以后,会多⼀个维护索引的操作,⼀些⼤表可能导致insert 速度⾮常慢。
聚簇索引排序查找快的原理一、聚簇索引的概念与特点聚簇索引是一种数据库索引的类型,其特点是数据行的物理顺序与索引的逻辑顺序相同。
聚簇索引是按照索引的列值对数据进行排序存储的,因此在查询时可以快速定位到所需的数据行。
与之相反,非聚簇索引则是将索引与数据行分开存储的。
二、聚簇索引的工作原理聚簇索引的工作原理可以简述为以下几个步骤:1. 创建聚簇索引:在表的建立过程中,可以选择一个或多个列作为聚簇索引。
数据库系统会根据所选列的值对数据行进行排序,并将数据行与索引行一一对应地存储在磁盘上。
2. 数据行的插入与排序:当有新数据行插入时,数据库系统会根据聚簇索引的排序规则将其插入到合适的位置,以保持数据行的顺序与索引的顺序一致。
3. 数据行的查找:当需要查询数据时,数据库系统可以利用聚簇索引的有序性进行快速定位。
通过二分查找等算法,可以在较短的时间内找到所需的数据行。
三、聚簇索引的优势聚簇索引相比于非聚簇索引具有以下几个优势:1. 提高查询速度:由于聚簇索引的有序性,查询时可以快速定位到所需的数据行,从而提高查询速度。
2. 减少磁盘IO次数:聚簇索引将数据行与索引行一一对应地存储在磁盘上,可以减少磁盘IO次数,提高IO效率。
3. 降低存储空间占用:由于聚簇索引的存储方式,可以减少数据行的存储空间占用,节省存储资源。
四、使用聚簇索引时需要注意的事项在使用聚簇索引时,需要注意以下几个问题:1. 选择合适的列作为聚簇索引:选择合适的列作为聚簇索引可以提高查询效率。
一般来说,选择经常用于查询条件的列作为聚簇索引会更加有效。
2. 避免频繁的更新操作:由于聚簇索引的特性,频繁的更新操作可能导致数据行的移动,进而影响性能。
3. 注意索引的维护成本:聚簇索引需要维护索引的有序性,因此在插入、更新和删除数据时需要付出额外的维护成本。
4. 根据具体情况选择使用聚簇索引:聚簇索引并不适用于所有情况,需要根据具体的数据库设计和查询需求来选择是否使用聚簇索引。
常用查找算法的分类与特点在计算机科学中,查找算法是一种用于在数据集合中查找特定元素的方法。
查找算法的效率和性能对于许多应用程序来说至关重要,因为它们直接影响到程序的运行速度和资源使用情况。
本文将介绍一些常见的查找算法,并分析它们的特点和适用场景。
一、顺序查找顺序查找是最简单的查找算法之一。
它的基本思想是从数据集合的开头开始,逐个元素进行比较,直到找到目标元素或者遍历完整个数据集合。
顺序查找的优点是实现简单,对于小型数据集合或者无序数据集合来说,是一种可行的选择。
它不需要对数据进行预处理,也不需要额外的存储空间来保存索引或其他辅助信息。
然而,顺序查找的缺点也很明显。
它的平均查找时间复杂度为O(n),其中 n 是数据集合的大小。
这意味着当数据集合规模较大时,查找效率会非常低。
例如,如果我们要在一个包含 10000 个元素的数组中查找一个特定元素,最坏情况下可能需要比较 10000 次才能找到目标元素。
二、二分查找二分查找是一种在有序数据集合中进行查找的高效算法。
它的基本思想是通过不断将数据集合分成两半,比较目标元素与中间元素的大小,然后确定目标元素可能存在的子集合,重复这个过程直到找到目标元素或者确定目标元素不存在。
二分查找的优点是查找效率高,时间复杂度为 O(log n)。
这使得它在处理大规模有序数据集合时表现出色。
但是,二分查找要求数据集合必须是有序的。
如果数据集合是无序的,需要先进行排序,这会增加额外的时间和空间开销。
此外,二分查找在处理动态数据集合(即经常需要插入和删除元素的数据集合)时不太方便,因为每次插入或删除元素都可能破坏数据的有序性,需要重新进行排序。
三、哈希查找哈希查找是一种通过哈希函数将元素映射到哈希表中的特定位置来实现快速查找的算法。
哈希函数的设计至关重要,一个好的哈希函数能够将元素均匀地分布在哈希表中,减少冲突的发生。
当发生冲突时,通常采用链地址法或开放地址法等解决冲突的策略。
一、实验目的1. 理解索引顺序查找的基本原理。
2. 掌握索引顺序查找的实现方法。
3. 分析索引顺序查找的时间复杂度和效率。
二、实验原理索引顺序查找是一种基于索引的查找方法,它将数据分为两部分:索引和数据。
索引部分存储了数据中各个元素的位置信息,而数据部分则存储了实际的数据。
在查找过程中,首先通过索引找到目标元素的位置,然后再从数据部分中获取该元素。
索引顺序查找的基本步骤如下:1. 遍历索引,找到目标元素的位置。
2. 根据找到的位置,从数据部分获取目标元素。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm四、实验步骤1. 创建一个数据集,包括1000个随机整数。
2. 创建一个索引,记录每个元素在数据集中的位置。
3. 编写索引顺序查找函数。
4. 对数据集中的元素进行查找,并记录查找时间。
5. 分析查找结果,评估查找效率。
五、实验代码```pythonimport randomimport time# 创建数据集data_set = [random.randint(0, 10000) for _ in range(1000)]# 创建索引index = {data_set[i]: i for i in range(len(data_set))}# 索引顺序查找函数def index_search(data, target):if target in index:return index[target]else:return -1# 查找过程start_time = time.time()for target in data_set:index_search(data_set, target)end_time = time.time()# 输出查找时间print("查找时间:", end_time - start_time)```六、实验结果与分析1. 查找时间:实验结果显示,在数据集中进行1000次查找操作所需的时间为0.0009秒,平均每次查找所需时间为0.000009秒。
3. 索引顺序表的查找
索引顺序查找也叫分块查找,它是顺序查找的一种改进方法。
以索引顺序表表示静态查找表时,查找方法可用分块查找来实现。
3.1 基本思想
假设有n个数据元素,将这n个元素按“分块有序”划分为m块(m≤n)。
所谓“分块有序”是指每一块中的元素不要求有序(可以有序),但块与块之间有序,即第2块中的元素的所有关键字均大于第1块中的最大关键字,第3块中的元素的所有关键字均大于第2块中的最大关键字,……,以此类推。
在此查找法中,除了数据表本身以外,还要建立一个索引表,该索引表为每一子块设置一个索引项,每一个索引项包括两部分:关键字项(其值为该子块内的最大关键字)和指针项(指示该子块第一个元素在数据表中的位置,即起始地址)。
数据表分块示意如下图所示:
图3- 1 分块查找表及索引表
3.2 查找过程
分块查找过程需要分三步进行,先选取各块中的最大关键字和第一个元素构成一个索引表,然后确定待查记录所在的块,最后在块中顺序查找。
索引表是按关键字有序的,且长度一般不大,所以可以使用二分查找,也可以使用顺序查找以确定待查记录在哪个块。
确定好在哪个块之后,在块里面使用顺序查找方法查找(块的元素不要求有序)。
3.3 平均查找长度
设长度为n的表均匀分成b块,每块含有s个元素(记录),则b=n/s。
当使用顺序查找方法查找所在块时,分块查找的平均查找长度=(b+1)/2 + (s+1)/2 = (n/s+s)/2+1;当使用二分查找方法查找所在块时,分块查找的平均查找长度=log2(n/s+1)+s/2。
其性能介于顺序查找和二分查找之间。
顺序查找直接查找折半查找算法一、顺序查找算法顺序查找也被称为线性查找,是一种简单直观的算法。
其基本原理是逐个遍历数据集中的元素,直到找到目标值为止。
算法步骤如下:1.从数据集的第一个元素开始顺序遍历。
2.如果当前元素与目标值相同,返回元素的索引。
3.如果遍历到数据集的最后一个元素仍未找到目标值,返回失败。
顺序查找算法的时间复杂度为O(n),其中n为数据集的大小。
由于需要遍历整个数据集,这种算法适用于小型数据集。
二、直接查找算法直接查找算法也被称为线性查找优化算法,其思想是在遍历数据集时,通过跳跃一定步长快速确定目标值所在的范围,然后在该范围内进行顺序查找。
算法步骤如下:1.设定步长为k。
2.从数据集的第一个元素开始,每次跳跃k个元素。
3.如果当前元素大于目标值,将步长减半并继续跳跃,直到找到目标值或步长变为1为止。
4.在跳跃范围内进行顺序查找,找到目标值则返回索引,否则返回失败。
直接查找算法的时间复杂度为O(n/k),其中n为数据集的大小,k为步长。
通过调整步长,可以在时间和空间之间取得平衡。
折半查找算法是一种效率较高的算法,也被称为二分查找。
其基本原理是将数据集分为两半,通过比较目标值与中间元素的大小关系来确定目标值所在的范围,然后在该范围内进行递归查找。
算法步骤如下:1.将数据集按升序或降序排列。
2.初始化左右指针,分别指向数据集的第一个和最后一个元素。
3.计算中间元素的索引。
4.如果中间元素等于目标值,则返回索引。
5.如果中间元素大于目标值,则更新右指针为中间元素的前一个元素,重复步骤36.如果中间元素小于目标值,则更新左指针为中间元素的后一个元素,重复步骤37.当左指针大于右指针时,返回失败。
折半查找算法的时间复杂度为O(logn),其中n为数据集的大小。
由于每次都将数据集分为两半,因此效率较高。
但是该算法要求数据集必须有序。
综上所述,顺序查找、直接查找和折半查找算法都是常用的算法,适用于不同规模和有序性的数据集。
简述查找的分类
查找是计算机科学中一种通用的数据存取方法,有着广泛的应用。
它可以提供最佳性能,有效地搜索出指定的记录或数据。
查找有两种主要分类:顺序查找和索引查找。
顺序查找是按照顺序逐个检查存储器中的信息,看看信息是否匹配,依次检验所有的记录才能找到对应的数据。
它的优点是操作简单,但缺点是效率低下,搜索较大的文件时,需要比较多的时间才能找到查找的数据。
索引查找是一种组织数据的方法,通过创建一个特殊的索引表,可以减少数据查找所需要的时间。
索引通常是以数据的每个字段为索引组成,以便封装了数据,使查找功能更容易更快地获取到所需要的数据,缺点是索引可能会损坏存储在特定数据库中的值,从而影响其他的功能。
总的来说,查找的分类包括顺序查找和索引查找,它们在检索数据时有各自的优缺点,各个有着不同的应用场景,正确地使用对查找来说是非常重要的。
常见的查找算法(六):分块查找 分块查找⼜称索引顺序查找,它是顺序查找的⼀种改进⽅法。
算法流程:先选取各块中的最⼤关键字构成⼀个索引表;查找分两个部分:先对索引表进⾏⼆分查找或顺序查找,以确定待查记录在哪⼀块中;然后,在已确定的块中⽤顺序法进⾏查找。
注:算法的思想是将n个数据元素"按块有序"划分为m块(m ≤ n)。
每⼀块中的结点不必有序,但块与块之间必须"按块有序",每个块内的的最⼤元素⼩于下⼀块所有元素的任意⼀个值。
所以,给定⼀个待查找的key,在查找这个key值位置时,会先去索引表中利⽤顺序查找或者⼆分查找来找出这个key所在块的索引开始位置,然后再根据所在块的索引开始位置开始查找这个key所在的具体位置。
下⾯给出⼀段分块查找的代码,其思想和上⾯描述的⼀样,都是通过索引表来找key的位置。
先给出主表和索引表:1// 主表,size=302static int[] mainList = new int[]{3 101, 102, 103, 104, 105, 0, 0, 0, 0, 0,4 201, 202, 203, 204, 0, 0, 0, 0, 0, 0,5 301, 302, 303, 0, 0, 0, 0, 0, 0, 06 };78// 索引表9static IndexItem[] indexItemList = new IndexItem[]{10new IndexItem(1, 0, 5),11new IndexItem(2, 10, 4),12new IndexItem(3, 20, 3)13 }; 索引表类:static class IndexItem {public int index; //值⽐较的索引public int start; //开始位置public int length;//块元素长度(⾮空)public IndexItem(int index, int start, int length) {this.index = index;this.start = start;this.length = length;}//... getter and setter} 索引查找算法:1public static int indexSearch(int key) {2 IndexItem indexItem = null;34//建⽴索引规则5int index = key / 100;67//遍历索引表8for(int i = 0;i < indexItemList.length; i++) {9//找到索引项10if(indexItemList[i].index == index) {11 indexItem = indexItemList[i];12break;13 }14 }1516//索引表中不存在该索引项17if(indexItem == null)18return -1;1920//根据索引项,在主表中查找21for(int i = indexItem.start; i < indexItem.start + indexItem.length; i++) {22if(mainList[i] == key)23return i;24 }2526return -1;27 } 时间复杂度分析:先按⼆分查找去找key在索引表为⼤概位置(所给出代码是顺序查找),然后在主表中的可能所在块的位置开始按顺序查找,所以时间复杂度为O(log₂(m)+N/m),m为分块的数量,N为主表元素的数量,N/m 就是每块内元素的数量。
索引类型和索引方法索引类型和索引方法是数据库中用于提高查询效率和数据存储的技术。
在数据库中,索引是指在列或者多个列上创建的特殊结构,用来加快数据的检索速度。
本文将详细介绍索引类型和索引方法,包括它们的定义、分类和使用方法。
1.索引类型索引类型是指在数据库中创建索引所使用的算法或结构。
不同的索引类型适用于不同的场景,常见的索引类型包括:1.1B树索引:B树索引是最常用的索引类型之一,通常用于关系型数据库中。
B树索引通过使用二叉树的结构,在每个节点上存储多个索引值,以便快速地定位数据。
B树索引适合于范围查询和精确查找,但是在更新和插入数据时需要维护索引结构,会影响性能。
1.2哈希索引:哈希索引将索引列的值通过哈希函数计算得到索引值,然后将索引值与数据的地址关联存储。
哈希索引适合于等值查询,因为它可以直接计算出需要查找的数据的地址,查询速度非常快。
但是,哈希索引不支持范围查询,而且在数据量变化时需要重新计算哈希函数。
1.3全文索引:全文索引通常用于文本内容的,比如文章、邮件和网页等。
全文索引将文本内容进行分词,并建立索引表,以便用户可以根据关键词快速定位到相关的文本。
全文索引需要消耗较大的存储空间,并且需要进行词典、分词等复杂操作。
1.4空间索引:空间索引用于地理位置相关的数据查询,如地图、位置坐标等。
空间索引将地理位置数据以树状结构组织存储,并提供了丰富的地理位置查询功能,如范围查询、最近邻查询等。
空间索引的建立和查询需要使用专门的地理位置算法和数据结构。
2.索引方法索引方法是指在具体的数据库系统中,根据索引类型实现的具体算法和策略。
常见的索引方法包括:2.1顺序扫描:顺序扫描是最简单的索引方法,它直接遍历数据表的每一行,并进行逐一比对。
顺序扫描的优点是实现简单,不需要额外的索引结构,但是在大数据量的情况下会降低查询效率。
2.2二分查找:二分查找是一种快速查找算法,适用于有序数据表和B树索引。
在二分查找中,通过比较要查找的值与中间值的大小关系,从而将查找范围逐步缩小到目标值。
课程设计:索引顺序查找1问题描述试编写索引顺序查找的程序。
(1)要求能自动建立索引表;(2)对任意待查找的关键字,若查找成功,给出其关键字比较次数。
2 设计索引顺序查找的索引存储表示的图例2、态查找的典型关键字类型说明过程:Typedef float KeyType;//实型Typedef int KeyType ; //整型Typedef char *keytype;//字符串型数据元素定义为:typedef struct{keytype key; //关键字域…//其他域}ElemType;3.抽象数据类型静态查找表的定义为:ADT StaticSearchTable{数据对象D:D是具有相同特性的数据元素的集合。
各个数据元素均含有类型相同,可唯一标识数据元素的关键字。
数据关系:数据元素问题同属一个集合。
基本操作p:Create(&T,n);操作结果:构造一个含有n个数据元素的静态查找表ST。
Destroy(&ST):初始条件:静态查找表ST存在。
操作结果:销毁表ST。
Search(ST,key);初始条件:静态查找表ST存在,key为和关键字类型相同的给定值。
操作结果:若ST中存在其关键字等于key的数据元素,则函数值为该元素的值或在表中的的位置,否则为“空”。
Traverse(ST,Visit());初始条件:在静态查找ST存在,Visit是对元素操作的应用函数。
操作结果:按某种次序对ST的每个元素调用函数visit()一次且仅一次。
一旦visit()失败,则操作失败。
}ADT StaticSearchTable4、索引表的数据类型定义:#define MaxIndex <索引表的最大长度> //根据实际情况而定typedef struct{KeyType key;Int link;}IdxType5、主程序:main(){初始化;for {接受命令;处理命令;}}6、各模块之间的调用关系如下:主程序模块↓随机函数模块↓索引顺序查找模块7、详细算法设计:(1)、随机数算法如下:void init(){int i,k,m,j,m1;len=(int)sqrt(n);n1=n-len*(len-1);cout<<"系统将自动产生"<<n<<"个随机数";k=0;j=0;while(1){m=rand()%500;if((m>60)&&(m<70)) {a[0][0]=m; break;}}for(j=1;j<len;j++){ m1=m-abs(rand()%60);a[0][j]=m1;}m=m+40+abs(rand()%80);for(i=1;i<len-1;i++){ a[i][0]=m;for(j=1;j<len;j++){ m1=m-abs(rand()%60);a[i][j]=m1;}m=m+40+abs(rand()%80);}a[len-1][0]=m;for(j=1;j<n1;j++){ m1=m-abs(rand()%60);a[len-1][j]=m1;}print();} (2)、查找算法如下:#define MaxIndex<索引表的最大长度> //应根据实际确定typedef struct{KeyType key;Int link;}IdxType;int IdxSearch(Seqlist A[],Index[],int b,keyType K,int n){ //分块查找关键字为k的记录,索引表为index[0..b-1]int low=0,high=b-1,mid,I;int s=n/b;while(low<=high) {//在索引表中查找mid=(low+high)/2;if(index[mid].key<k) low=mid+!Else high=mid-1;}if (low<b){ //在顺序表中查找for(I=index[low].link;I<=index[low].link+s-1 && I<n;I++)if(A[I].key==k) return I;return –1;}return –1:}8、程序基本操作说明:int IdxSearch(Seqlist A[],Index[],int b,keyType K,int n){}//索引顺序查找关键字K的记录,索引表为Index[0…b-1]void Bubble_Sort(RecType R[],int n)//用来实现冒泡排序void CreateIndexList(MainList&A,IndexList&B,int n,int m)//根据从键盘输入的数据建立索引存储的主表和索引表,每个子表采用静态链接存储,n和m分别给出主表和索引表的最大长度3 调试报告调试过程中,随机函数不能正确产生随机数字,运行的时候运行两次就会产生编译错误,要运行一次就要编译一次,第一次运行的时候出现一个警告,再编译一次就会提示没错误通过,D:\学习软件\程序\epanday\panda.cpp(22) : error C2065: 'n' : undeclared identifier D:\学习软件\程序\epanday\panda.cpp(22) : error C2448: '<Unknown>' : function-style initializer appears to be a function definitionD:\学习软件\程序\epanday\panda.cpp(90) : error C2065: 'init' : undeclared identifier 执行cl.exe 时出错.4结束语,这次实验让我深刻体会到编写程序的痛苦啊!编译错误让我无从下手去改正,想来想去总找不到最合适的方法,程序中稍微又点考虑不周就会再运行中出现错误出现死循环甚至死机,在这次课程设计中我设计的程序大多时候是处于死机状态,在朋友的帮助下我完成了这个艰难的任务,但是现在这个程序还是又很多缺陷。
想随机数字的产生至今仍没得到解决,程序查找数的时间过长等等一系列等待解决的问题需要去探讨&解决。
在函数调用过程中也出现很多麻烦。
经过这次课程实验设计让我明白了几点:1、程序编写过程中,要及时加商注释,在这次程序中我没又很好的做到这点,致使我今天写的程序明天就看不懂了。
2、程序已经改动注释也要改动否则注释只会起到反作用。
3、程序编写要有自己简单实用的风格,便于自己阅读和检查。
附录F1 源代码#include<iostream.h>#include<math.h>#include<stdlib.h>int n,len,n1,count,kk;int a[10][100];typedef struct{KeyType key;Int link;}IdxType;void print(){int i,j;cout<<"系统自动生成的索引表如下\n";for(i=0;i<len-1;i++){for(j=0;j<len;j++)cout<<a[i][j]<<" ";cout<<endl;}for(j=0;j<n1;j++)cout<<a[len-1][j]<<" ";cout<<endl;}void init(){int i,k,m,j,m1;len=(int)sqrt(n);n1=n-len*(len-1);cout<<"系统将自动产生"<<n<<"个随机数";k=0;j=0;while(1){m=rand()%500;if((m>60)&&(m<70)) {a[0][0]=m; break;}}for(j=1;j<len;j++){ m1=m-abs(rand()%60);a[0][j]=m1;}m=m+40+abs(rand()%80);for(i=1;i<len-1;i++){ a[i][0]=m;for(j=1;j<len;j++){ m1=m-abs(rand()%60);a[i][j]=m1;}m=m+40+abs(rand()%80);}a[len-1][0]=m;for(j=1;j<n1;j++){ m1=m-abs(rand()%60);a[len-1][j]=m1;}print();}int IdxSearch(Seqlist A[],Index[],int b,keyType K,int n) {int low=0,high=b-1,mid,I;int s=n/b;while(low<=high) {mid=(low+high)/2;if(index[mid].key<k) low=mid+!Else high=mid-1;}if (low<b){for(I=index[low].link;I<=index[low].link+s-1 && I<n;I++) if(A[I].key==k) return I;return –1;}return –1:}void sort(int i){int j;if (i<len-1){for(j=0;j<len;j++)if (a[i][j]==kk){count++;cout<<"次数"<<count<<endl;exit(0);}else count++;}if (i==len-1){for(j=0;i<n1;i++)if (a[i][j]==kk) {cout<<"次数"<<count<<endl;exit(0);} else count++;}cout<<"没有找到!";}void find(){ int i,j;cout<<"请输入您要找的值:";cin>>kk;cout<<endl;count=0;for (i=0;i<len-1;i++){if ((a[i][0]<kk)&&(a[i+1][0]>kk)){ count++;sort(i+1);}else count++;}}void main(){cout<<"请输入您要建立的元素个数:";cin>>n;init();find();}F2 运行结果:表中找不的结果:查找倒的结果:。