数据查找

2024-07-05

数据查找(共6篇)

数据查找 篇1

随着信息技术, 通信技术和计算机技术的高速发展, 数据库应用范围的不断扩大, 不同的群体都面临着如何查找使用大量数据的问题, 尤其是金融业, 笔者就分治算法在金融业的运用给出一个具体的解决方案。

一、问题介绍

我们把给定的n个数据放到有n个元素的数组a[0:n]中, 要求从中找出第k小的数据。

二、算法分析与构造

选择问题可在O (nlogn) 时间内解决, 方法是首先对这n个元素进行排序, 然后取出a[k-1]中的元素。本报告用的是快速排序, 因为用快速排序可以获得更好的平均性能, 尽管该算法有一个比较差的渐近复杂性O (n2) 。如果在执行两个while循环后支点元素a[1]被交换到a[j], 那么a[i]是a[l:j]中的第j-l+1个元素;如果要寻找的第k个元素在a[l:r]中, 并且j-l+1等于k, 则答案就是a[1];如果j-l+1

三、程序代码与说明

程序语言:C

运行环境:Visual C++6.0

程序代码:

//返回p[m:n]中第k小的元素

printf ("请输入数组的元素个数及要查找的第k小的数分别为:") ;

四、数值结果与讨论

例如, 开始输入的数组维数为8维的, 要寻找第4小的元素。输入的a[8]为{23, 45, 4, 67, 78, 5, 90, 34}, 则输出的结果为34。

编译通过, 运行, 出现如下界面, 如图1所示。

输入“8 4”, 按回车, 得

逐个输入数组的值:

23 45 4 67 78 5 90 34

再回车, 得

再演示, 输入数组的第4小的数为34。

经检验, 此结果是正确的。

可以验证该程序具有很大的灵活性, 你可以任意输入数组并找出该数组中第k小的元素。该程序在最坏情况下的复杂性是O () , 此时left总是为空, 而且第k个元素总是位于right, 如果left和right总是同样大小或者相差不超过一个元素。

五、问题改正

可以对选择支点元素进行改正, 则在最坏情况下的时间开销也可以变成O (n) 。

一种选择支点元素的方法是使用“中间的中间 (median-of-median) ”规则, 该规则首先将数组a中的n个元素分成n/r组, r为每一整常数, 除了最后一组外, 每一组都有r个元素。然后通过在每组中对r个元素进行排序来寻找每组中位于中间位置的元素。最后根据所得到的n/r个中间元素, 递归使用选择算法, 求得所需要的支点元素。

参考文献

[1]贺红, 马绍汉.算法分析与设计技术[M].北京:科学出版社, 2004.

[2]严蔚敏, 吴伟民.数据结构[M].北京:清华大学出版社, 2002.

[3]王立柱.数据结构[M].北京:清华大学出版社, 2003.

数据查找 篇2

学生姓名 学生班级 学生学号 指导老师

重庆邮电大学计算机学院 计算机专业实验中心

一、实验内容

1)有序表的二分查找

建立有序表,然后进行二分查找 2)二叉排序树的查找 建立二叉排序树,然后查找

二、需求分析

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果xa[n/2],则只要在数组a的右半部搜索x.时间复杂度无非就是while循环的次数!总共有n个元素,渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数 由于你n/2^k取整后>=1 即令n/2^k=1 可得k=log2n,(是以2为底,n的对数)所以时间复杂度可以表示O()=O(logn)下面提供一段二分查找实现的伪代码: BinarySearch(max,min,des)mid-<(max+min)/2 while(min<=max)mid=(min+max)/2 if mid=des then return mid elseif mid >des then max=mid-1 else min=mid+1 return max 折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果xa[n/2],则我们只要在数组a的右 半部继续搜索x。

三、概要设计

1、顺序查找,在顺序表R[0..n-1]中查找关键字为k的记录,成功时返回找到的记录位置,失败时返回-1,具体的算法如下所示:

int SeqSearch(SeqList R,int n,KeyType k){

} int i=0;while(i

} if(i>=n){ } printf(“%d”,R[i].key);return i;return-1;else printf(“%d”,R[i].key);i++;

2、二分查找,在有序表R[0..n-1]中进行二分查找,成功时返回记录的位置,失败时返回-1,具体的算法如下:

int BinSearch(SeqList R,int n,KeyType k){

} return-1;} int low=0,high=n-1,mid,count=0;while(low<=high){ mid=(low+high)/2;printf(“第%d次查找:在[ %d ,%d]中找到元素R[%d]:%dn ”,++count,low,high,mid,R[mid].key);if(R[mid].key==k)

return mid;high=mid-1;low=mid+1;if(R[mid].key>k)else

四、详细设计

源代码:

#include #include

static int a[1024],count=0;

void Find1(int low,int high,int x){ int mid;if(low<=high){ mid=(low+high)/2;count++;if(a[mid]>x)Find1(low,mid-1,x);else if(a[mid]

void Find2(int low,int high,int x){ int mid;if(low<=high){ mid=(low+high)/2;count++;if(a[mid]x)Find2(mid+1,high,x);else printf(“n查é找ò到?元a素?位?置?为a%d,?查é找ò次?数簓为a%d。£”,mid,count);} else printf(“n查é找ò失骸?败悒?,?查é找ò次?数簓为a%d。£”,count);} int main(){ int n,x;printf(“请?输?入?元a素?个?数簓:”);scanf(“%d”,&n);printf(“n请?按恪?从洙?高?到?低台?或ò从洙?低台?到?高?顺3序ò输?入?各÷元a素?(以?空?格?隔?开a):nn”);for(int i=1;i<=n;i++)scanf(“%d”,&a[i]);printf(“n请?输?入?要癮查é找ò的?元a素?:阰”);scanf(“%d”,&x);if(a[1]<=a[n])Find1(1,n,x);else Find2(1,n,x);printf(“nn”);system(“pause”);}

五、心得体会

通过这次在实现顺序和二分查找算法的过程中,让我对顺序和二分查找算法有了更多的了解。查找根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)的操作,应用十分广泛。顺序查找是一种最简单的查找方法。它的基本思路是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。二分查找也称为折半查找要求线性表中的结点必须己按关键字值的递增或递减顺序排列。它首先用要查找的关键字k与中间位置的结点的关键字相比较,这个中间结点把线性表分成了两个子表,若比较结果相等则查找完成;若不相等,再根据k与该中间结点关键字的比较大小确定下一步查找哪个子表,这样递归进行下去,直到找到满足条件的结点或者该线性表中没有这样的结点。在学习过程中,善于发现,会找到更多的捷径。

成语查找不犯难 篇3

你一定想知道娜娜有什么秘诀吧!其实,娜娜使用了一款她早已在使用的小软件——我爱成语字典。

我爱成语字典是一款免费软件,该软件共收录汉语成语13000多条,包括拼音、注释、出处、例句,提供方便的查找功能:可以按照拼音首字母查找、汉字查找,还可以按照注释或出处反查成语,同时还可以利用词典维护的功能进行成语库的扩充、修改。

一、成语列表大点播

二、查词案例大放送

利用我爱成语字典的多种查找功能,你可以方便地找到你想要的成语。

案例一:查知道发音但不会写的成语

案例二:查包含具有某个意思的成语

案例三:查包含某个字词的所有成语

案例四:查出自某本典籍的所有成语

小提示:上图右侧列表列出的是以音序排列的所有成语。你可以通过右侧的滑动块移动定位到某字开头的成语,然后点击该成语查其解释。

配网线路故障快速查找 篇4

由于线路事故发生的地段不同, 其继电保护动作是不一样的。电流速断保护的保护范围一般为线路全长的1/2以内, 就是说电流速断保护装置的动作跳闸, 故障点一般位于线路靠近变电所的区域;过电流保护的保护范围则是整条线路, 但过流保护装置设有延时继电器, 在与速断保护装置配合使用时, 一般在线路末段发生故障时才动作跳闸。当电流速断保护与过流保护同时动作跳闸时, 故障点大多位于线路中段。

2 根据线路路径情况查找故障区域

线路路径在污染区的, 大雾天气或春、秋季节小雨天气情况下, 该线路发生事故跳闸时, 首先应该考虑的是污闪事故, 要重点对污染区线路进行排查;线路路径通过竹、林区的, 在夏、秋季节刮风天气发生事故跳闸时, 应重点检查穿越竹、林区的线路;线路路径在施工区的, 在良好天气情况下发生事故跳闸时, 首先要考虑是否是野蛮施工造成的, 检查时就应特别注意施工区域的情况。

3 根据线路的绝缘情况查找故障区域

全电缆线路绝缘最薄弱的地方是终端头、中间接头处。所以全电缆线路发生故障跳闸, 应该首先检查终端头、中间接头是否被击穿;由架空绝缘线和架空裸导线组成的线路, 首先应该考虑架空裸导线是否有故障。

4 根据用电性质和负荷情况查找故障区域

数据结构实验报告-排序与查找 篇5

学生姓名:XXX 学 号:20***

指导教师:刘峤 实验地点:信软机房306

实验时间:2014/6/20

一、实验室名称:软件实验室

二、实验项目名称:数据结构与算法—排序与查找

三、实验学时:4

四、实验原理:

快速排序的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一躺快速排序的算法是:

1)设置两个变量I、J,排序开始的时候I:=1,J:=N

2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];

3)从J开始向前搜索,即(J:=J-1),找到第一个小于X的值,两者交换;

4)从I开始向后搜索,即(I:=I+1),找到第一个大于X的值,两者交换;

5)重复第3、4步,直到I=J。

二分法查找(折半查找)的基本思想:

(1)确定该区间的中点位置:mid=(low+high)/2 min代表区间中间的结点的位置,low代表区间最左结点位置,high代表区间最右结点位置

(2)将待查a值与结点mid的关键字(下面用R[mid].key)比较,若相等,则查找成功,否则确定新的查找区间:

A)如果R[mid].key>a,则由表的有序性可知,R[mid].key右侧的值都大于a,所以等于a的关键字如果存在,必然在R[mid].key左边的表中,这时high=mid-1;

B)如果R[mid].key

C)如果R[mid].key=a,则查找成功。

(3)下一次查找针对新的查找区间,重复步骤(1)和(2)

(4)在查找过程中,low逐步增加,high逐步减少,如果high

五、实验目的:

本实验通过实现快速排序和折半查找算法,使学生理解如何实现快速查找和排序的基本算法思想。通过练习,加强对算法的理解,提高编程能力。

六、实验内容:

(1)实现数据序列的输入;

(2)实现快速排序算法,并对输入的序列排序后输出;

(3)实现折半查找算法,并在步骤(2)排序后的序列上,进行任意地 查找,并输出查询结果。

七、实验器材(设备、元器件):

八、数据结构及程序

#include

#define MAX_LEN 100

void Sort(int *data,int left,int right){

int i,j,temp;

i=left;

j=right;

temp=data[left];

if(left>right)

return;

while(i!=j){

while(data[j]>=temp&&j>i)

j--;

if(j>i)

data[i++]=data[j];

while(data[i]<=temp&&j>i)

i++;

if(j>i)

data[j--]=data[i];

}

data[i]=temp;

Sort(data,left,i-1);PC机一台,装有C/C++语言集成开发环境。

Sort(data,i+1,right);}

int Search(int *data,int start,int end,int key,int num){

int result;

int p =(start + end)/ 2;

if(data[p] == key&&start<=end){

result = p;

num++;

if(data[p] > key)

result = Search(data, start, p, key,num);

else

result = Search(data, p + 1, end, key,num);

return result;

}

else if(num==0&&start>end){

result =-1;

printf(“n 404 NO FOUNDn”);

return result;

}

else if(num!=0&&start>end){

result=-1;

if(num==1)

printf(“nFounded number only one”);

else

printf(“nFounded number more than one”);

return result;

}

else if(result!=-1){

if(data[p] > key)

result = Search(data, start, p-1, key, num);

else

result = Search(data, p + 1, end, key, num);

return result;

}

else {

result=-1;

return result;

} }

void loadFile(int *data,char *filename,int n){

int i;

FILE *pfile=NULL;

pfile=fopen(filename,“r”);

if(!pfile){

printf(“Open file failn”);

exit(0);

}

else

printf(“Open file success!n”);

for(i = 0;i < n;i++)

fscanf(pfile , “%d ”,&data[i]);}

int main(int argc, const char * argv[]){

int input=1,data[MAX_LEN],num=0,key=1,i,cmd;

char filename[100];

printf(“Choose Mode :n 1.Input Mode

2.File Moden”);

scanf(“%d”,&cmd);

if(cmd==1){

printf(“Input data :(Enter 0 to detemine)n”);

while(input!=0){

printf(“Enter the %d data :”,num+1);

scanf(“%d”,&input);

if(input!=0){

data[num]=input;

num++;

}

}

}

else{

printf(“nInput the address of the file: ”);

scanf(“%s”,filename);

printf(“nInput the number of elem: ”);

scanf(“%d”,&num);

loadFile(data,filename,--num);

}

Sort(data, 0, num);

printf(“nSort result: ”);

for(i=1;i<=num;i++)

printf(“%d ”,data[i]);

printf(“nn”);

while(key!=0){

printf(“nInput a key to search :(Enter 0 to detemine)”);

scanf(“%d”,&key);

if(key!=0)

Search(data, 0, num, key, 0);

}

return 0;}

九、程序运行结果: 1.打开程序:

2.尝试手动输入模式:

3.搜索已存在数: 4.搜索不存在数:

5.尝试文件读入模式并搜索

实验成功。

十、实验结论:

使用好的排序与查找算法对于程序的运行效率至关重要,一个好的算法,适合的算法能使计算机对数据的处理事半功倍,而选用错误的算法,不但可能事倍功半,还有可能造成不稳定因素。

快速排序的时间复杂度为n(log2n),是排序算法中最为快速的一种,但是不稳定,对基本有序的序列效率较差。

二分查找算法在查找算法中,速度快,效率高,但是要求数据要有序。

十一、总结及心得体会:

当空间充足,对稳定性要求不高的情况,排序算法宜使用快速排序。

电力电缆故障查找 篇6

1 提出问题

××钢厂选烧区3#配电室9#馈出线, 所带用户为硬矿加工、火车泵房及新原料场施工电源等, 2007年6月30日, 9#馈出线电缆发生单相接地故障。此电缆属直埋电缆, 规格为3×120mm2, 敷设时间已有十年, 2007年3月因新建炼铁新原料厂占地, 电缆路由需要改变, 电缆加长400多米, 增加一个电缆中间接头, 但整条电缆总长及敷设路径不详。敷设路径还经过原料施工现场, 穿过一条铁路, 直埋电缆的土质为0.5m~1.5m的矿渣, 路面情况复杂, 现场噪声大, 给我们查找电缆故障带来极大的困难。

2 解决问题

2.1 所用设备

Se baKMTT30-E脉冲发射仪;Se baKMTT16精确定位仪;SebaKMTSPG32便携式电缆故障定位系统;Se baKMTFM9890*7管线定位仪;2500V摇表一块, 导线若干。

2.2 查找过程

2.2.1 首先选用管线定位仪确定电缆具体走向

1) 确定电缆已断电, 关闭发射机, 将红色引线直接与电缆任意相连接, 将地钉打入地底, 然后将黑色引线与地钉相连, 尽量使黑色引线远离电缆并于电缆成直角。

2) 管线定位仪发射机可提供982Hz、9.82KHz及82KHz三种主动频率, 根据此次现场环境选择9.82KHz, 并将输出功率档置于H (高) 档, 接收机选择自动增益控制模式 (AUTO) 。

3) 打开发射机及接受机, 沿着电缆大体走向开始路径定位, FM9890*7接收机有三种路径查找方法:通过视觉符号指导操作的距离敏感左/右引导、声音信号强度及数字信号强度的判断。

2.2.2 电缆故障点预定位

1) 因为电缆故障相相对其它两相, 绝缘水平明显降低, 首先使用2500V摇表判断出电缆故障相C相, 且属于单相高阻接地故障。

2) 用低压脉冲法测量电缆长度和中间头位置。连接脉冲测试仪 (TDR) 向被试电缆发射一个低压脉冲, 由于电缆接头及末端都会改变电缆的阻抗, 每一次的改变都会把一部分脉冲返回到TDR去, 通过计算发射脉冲时间和收到脉冲时间的差值就可以的出阻抗发生变化的位置。发射脉冲的波形可以反映电缆阻抗变化的性质, 一个向上的发射波形表示遇到了一个连接点或者是电缆末端。通过以上方法判断电缆全长为1205米, 在450米及760米处有两个中间头。

3) 因为判断故障电缆接地为高阻接地, 所以要对故障点进一步判断, 必须用ARM弧反射法。弧反射法可以通过对故障电缆所反射的波形与参考波形做比较完成故障定位。利用前脉冲测试仪测出的电缆数据, 可得到参考波形。

首先启动脉冲反射仪 (T30-E) , 按“主菜单”按钮, 选择ARM模式, 根据电缆的已知长度调节“范围”的量程, 使电缆末端可以显示在屏幕上。然后根据实际情况选择“自动增益”使波形的显示较为理想, 按“开始测量”按钮保存这条波形作为参考波形, 按下触发按钮触发一单次高压脉冲, 得到红色的故障波形。在脉冲反射仪上参考波形和故障波形自动叠加, 参考波形和故障波形相比较发生急剧变化的部分就是故障点的位置。选择“光标”, 把终止光标移至故障点处的左侧最底点处 (根据经验, 稍微靠后一点会比较准确) , 最后, 屏幕上显示出故障点的距离为507米。

2.2.3 采用“冲击放电”的方法确定电缆故障点的精确位置

将仪器打到冲击放电挡位, 给故障电缆加高压, 与现场工作人员咨询507米左右大致位置后携带SebaKMTT16精确定位仪到现场进一步确定。利用仪器沿电缆路径寻找, 通过仔细比较, 最终确定故障点在某施工单位厨房内, 且此处符合仪器测定的507米的距离。在此处开挖后发现电缆表面有明显放电烧伤痕迹, 证明此处就是电缆故障点。

3 结语

上一篇:中层干部评价下一篇:我国高中学生历史教学