武汉纺织大学数据结构实验报告
武汉纺织大学《数据结构》实验报告
班级:信管专业班:学号:
实验时间:年月日指导教师:
实验四:查找操作与应用
一、实验目的:
1、掌握顺序查找、折半查找、哈希查找的基本方法和操作过程
2、掌握查找效率的分析方法
二、实验内容:
1、编写程序,实现顺序查找操作,可参考书本P260示例程序。
实验步骤:
①、在Java语言编辑环境中新建程序,建立一个顺序表(表长10),依次输入10个数据元素(对元素存放的先后顺序没有要求),并按照存储顺序输出所有元素;
②、输入带查找关键字,在顺序表中进行顺序查找;
③、输出查找结果。
2、编写程序,实现有序表折半查找操作,可参考书本P263示例程序。
实验步骤:
①、在Java语言编辑环境中新建程序,建立一个顺序表(表长10),依次输入10个数据元素(要求所有元素按照递增顺序排列),并按照存储顺序输出所有元素;
②、输入带查找关键字,在有序表中进行折半查找;
③、输出查找结果。
3、编写程序,实现哈希表查找操作。
实验步骤:
①、在Java语言编辑环境中新建程序,建立一个顺序表(表长12),依次输入10个数据元素,并按照存储顺序输出所有元素;
②、输入带查找关键字,在哈希表中进行查找;
③、输出查找结果。
已知:哈希函数为H(key)=key MOD 11,采用开放地址法、线性探测再散列解决冲突,输入元素为{ 55,19,31,23,68,20,27,9,10,79}。
三、操作步骤:
1.顺序查找
(1)将顺序查找方法添加入SeqList.java中
//顺序表查找关键字为key元素,返回首次出现的元素,若查找不成功返回-1
//key可以只包含关键字数据项,由T 类的equals()方法提供比较对象相等的依据
public int indexOf(T key){
if(key != null)
for(int i=0;i if(this.element[i].equals(key))//对象采用equals()方法比较是否相等 return i; return -1;//空表,key为空对象或者未找到时 } public T search(T key) {//查找,返回首次出现的关键字为key的元素 int find = this.indexOf(key); return find == -1?null:(T)this.element[find]; } (2)Linearsearch.java package search; import java.util.Scanner; /** * * author pang * */ public class Linearsearch { public static void main(String[] args){ SeqList list.append(2); list.append(3); list.append(4); list.append(5); list.append(6); list.append(7); list.append(8); list.append(9); list.append(10); list.append(11); System.out.println(list.toString()); System.out.println("输入要查找的数:"); Scanner scan = new Scanner(System.in); while(true){ int key = scan.nextInt(); System.out.println("顺序查找:"+list.search(key)); } } } (3)运行结果 2.折半查找 (1)将折半查找方法添加入SeqList.java中 //在按升序排序的数组中,折半查找关键字为key元素,若找到返回下标,否则返回-1 public int binarySearch(T key){ int begin = 0; int end = this.len-1; if(key != null) while(begin<=end){//边界有效 int mid = (begin+end)/2;//中间位置,当前比较元素位置 System.out.print(element[mid]+"? "); if(Integer.parseInt(element[mid].toString())==(Integer) key)//对象比较大小 return mid;//查找成功 if(Integer.parseInt(element[mid].toString())-(Integer) key>0)//给定对象小 end = mid-1;//查找范围缩小到前半段 else begin = mid+1;//查找范围缩小到后半段 } return -1;//查找不成功 } (2)Binarysearch.java package search; import java.util.Scanner; /** * * author pang * */ public class Binarysearch { public static void main(String[] args){ SeqList list.append(2); list.append(3); list.append(4); list.append(5); list.append(6); list.append(7); list.append(8); list.append(9); list.append(10); list.append(11); System.out.println(list.toString()); System.out.println("输入要查找的数:"); Scanner scan = new Scanner(System.in); while(true){ int key = scan.nextInt(); System.out.print("折半查找:"); System.out.println(list.binarySearch(key)); } } } (3)运行结果 3.哈希查找 (1)将构造哈希表和哈希查找的方法加入SeqList.java中 //除留余数法计算哈希值,构造哈希表 public void hash(int x,int y){ int h = x % y; if(Integer.parseInt(element[h].toString())==0)//该位置为空,不冲突this.set(h, x);//此处为set(int x,int y)的方法,与原set方法有一定差别else//冲突 hash(h+1,y);//开放地址法、线性探测再散列解决冲突} //哈希查找 public int hashSearch(int key,int y){ int h = key % y;//计算哈希值作为下标 for(int i=1;i<=y;i++) if(Integer.parseInt(element[h].toString())==0)//(0代表该位置为空)若查找位置为空,查找失败 return -1; else if(Integer.parseInt(element[h].toString())==key)//若查找位置正好为key,查找成功return h; else//若查找位置有值,但不等于key,解决冲突,继续查找 h=h+i; return hashSearch(h,y); } (2)Hashsearch.java package search; import java.util.Scanner; /** * * author pang * */ public class Hashsearch { public static void main(String[] args){ SeqList for(int i=0;i<12;i++){ list.append(0); } list.hash(55,11); list.hash(19,11); list.hash(31,11); list.hash(23,11); list.hash(68,11); list.hash(20,11); list.hash(27,11); list.hash(9,11); list.hash(10,11); list.hash(79,11); System.out.println(list.toString()); System.out.println("输入要查找的数:(0表示该位置为空)"); Scanner scan = new Scanner(System.in); while(true){ int key = scan.nextInt(); System.out.println(list.hashSearch(key,11)); } } } (3)运行结果 四、实验收获和建议: