ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:507.97KB ,
资源ID:28674001      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28674001.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程设计综合查找算法的实现.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程设计综合查找算法的实现.docx

1、数据结构课程设计综合查找算法的实现一、问题描述1、顺序表查找的问题描述 顺序查找又称为线性查找,它是一种最简单、最基本的查找方法。从顺序表的一端开始,依次将每一个数据元素的关键字值与给定Key进行比较,若某个数据元素的关键字值等于给定值Key,则表明查找成功;若直到所有的数据元素都比较完毕,仍找不到关键字值为Key的数据元素,则表明查找失败。2、有序表的查找问题描述 折半查找也称为二分查找,作为二分查找对象的数据必须是顺序存储的有序表,通常假定有序表是按关键字值从小到大排列有序,即若关键字值为数值,则按数值有序;若关键字值是字符数据,则按对应的Unicode码有序。二分查找的基本思想:首先取整

2、个有序表的中间记录的关键字值与给定值相比较,若相等,则查找成功;否则以位于中间位置的数据元素为分界点,将查找表分为左右两个子表,并判断待查找的关键字值Key是在左子表还是在右子表,再在子表中重复上述步骤,直到待查找的关键字值Key的记录或子表长度为0。3、哈希表查找的问题描述 在哈希表上进行查找的过程是要给定要查找的关键字的值,根据构造哈希表时设定的哈希函数求得哈希地址,若此哈希地址上为空,即没有数据元素,则查找不成功;否则比较关键字,若相等,则查找成功;若不相等,则根据构造哈希表时设置的处理冲突的方法找下一个地址,知道某个位置上为空或者关键字比较相等为止。 哈希表是在关键字和存储位置之间直接

3、建立了映像,但由于冲突的产生,哈希表的查找过程仍然是一个和关键字比较的过程。因此,仍需用平均查找长度来衡量哈希表的查找效率。查找过程中与关键字比较的次数取决于构造哈希表是选择的哈希函数和处理冲突的方法。哈希函数的“好坏”首先影响出现冲突的频率,假设哈希函数是均匀的,即它对同样一组随机的关键字出现冲突的可能性是相同的。因此哈希表的查找效率主要取决于构造哈希表时处理冲突的方法。4、二叉排序树的查找问题描述 在顺序表的3种查找方法中,二分查找具有最高的效率,但是由于二分查找要求表中记录按关键字有序,且不能用链表做存储结构,因此当表的插入、删除操作非常频繁时,为维护表的有序性,需要移动表中很多记录。这

4、种由移动记录引起的额外时间开销,就会抵消二分查找的优点。这里讨论的不仅是二叉排序树具有二分查找的效率,同时又便于在查找表中进行记录的增加和删除操作。5、界面设计模块问题描述 设计一个菜单模式界面,让用户可以选择要查找的方式,界面上还有退出按钮,可以退出程序。界面要求简洁明了,便于使用。6、按钮动作命令模块问题描述在设计好图形界面后,就必须对相应的按钮进行事件驱动程序设计。运行Java图形用户界面程序时,程序与用户交互,比如说,在框架中显示多个按钮,当点击按钮时,就会从按钮触发一个事件。同时,查找的操作必须要有输入和输出,则需要使用对话框和命令窗口进行输入关键字和输出结果。 二、问题分析按钮时事

5、件的源。图形界面中一共有5个按钮,先注册按钮,再创建监听器对象,当按钮上有行为要发生时,按钮通过监听器的actionPerformed方法通知监听器。点击按钮会使监听器中actionPerformed方法被调用。首先,点击一个按钮,从e.getActionCommand()方法从按钮返回行为命令,按钮的行为命令就是按钮的文本。调用各查找方法,之后输出查找结果。拿“顺序表的查找”按钮来说,点击之后,如果按钮的行为命令是顺序表的查找,则按顺序表的特点先建立一个存储结构为20的顺序表,利用JOptionPane.showInputDialog弹出输入对话框,让用户输入表长,定义一个整形变量强制转化获

6、取到字符串型的输入。然后利用java.util.Scanner类从控制台读关键字的序列,存放在记录顺序表中。利用对话框输入待查找的关键字,强制转化成KeyType型。最后,调用顺序查找的seqSearch方法,利用JOptionPane.showMessageDialog输出运行查找结果。三、数据结构描述public void actionPerformed(ActionEvent e) String command = e.getActionCommand(); . /顺序表的查找 if (command.equals(顺序表的查找) . /有序表的动作实现 if (command.equa

7、ls(有序表的查找) . /二叉排序树的动作实现 if (command.equals(二叉排序树的查找) . /哈希表开放地址法的查找 if (command.equals(哈希表开放地址法的查找) . /退出 if (command.equals(退出) System.exit(0); 四、算法设计 我负责的是按钮动作的实现。1、流程图 2、具体算法 if (command.equals(顺序表的查找) System.out.println(创建顺序查找表); ST=new SeqList(20); Scanner sc1=new Scanner(System.in); String tm

8、p1 = JOptionPane.showInputDialog(this, 请输入查找表的表长:); int n =Integer.parseInt(tmp1); KeyType k= new KeyTypen; System.out.print(请输入查找表中的关键字序列:); for (int i = 0; i n; i+) /输入关键字序列 ki = new KeyType(sc1.nextInt(); for(int i=1;in+1;i+) /创建记录顺序表,0号存储单元不存放元素 RecordNode r = new RecordNode(ki-1); try ST.insert

9、(i, r); catch (Exception e1) / TODO Auto-generated catch block e1.printStackTrace(); String tmp2 = JOptionPane.showInputDialog(this,请输入待查找的关键字:); int n1 =Integer.parseInt(tmp2); key1=new KeyType(n1); JOptionPane.showMessageDialog(null,seqSearch( + key1.getKey() + )= + ST.seqSearch(key1); /有序表的动作实现 i

10、f (command.equals(有序表的查找) ST=new SeqList(20); Scanner sc1=new Scanner(System.in); String tmp1 = JOptionPane.showInputDialog(this, 请输入查找表的表长:); int n =Integer.parseInt(tmp1); KeyType k= new KeyTypen; System.out.print(请输入查找表中的关键字序列:); for (int i = 0; i n; i+) /输入关键字序列 ki = new KeyType(sc1.nextInt(); f

11、or(int i=1;in+1;i+) /创建记录顺序表,0号存储单元不存放元素 RecordNode r = new RecordNode(ki-1); try ST.insert(i, r); catch (Exception e1) / TODO Auto-generated catch block e1.printStackTrace(); String tmp2 = JOptionPane.showInputDialog(this,请输入待查找的关键字:); int n1 =Integer.parseInt(tmp2); key2=new KeyType(n1); JOptionPa

12、ne.showMessageDialog(null,binarySearch( + key2.getKey() + )= + ST.binarySearch(key2); /二叉排序树的动作实现 if (command.equals(二叉排序树的查找) BSTree bstree = new BSTree(); Scanner sc1=new Scanner(System.in); String tmp1 = JOptionPane.showInputDialog(请请输入二叉排序树的结点个数:); int n =Integer.parseInt(tmp1); System.out.print

13、(请输入结点的关键字序列:); for (int i = 0; i n; i+) /输入关键字序列 bstree.insertBST(sc1.nextInt() ; System.out.println(n创建的二叉排序树的中序遍历序列为: ); bstree.inOrderTraverse(bstree.getRoot(); System.out.println(); String tmp2 = JOptionPane.showInputDialog(请输入关键字); int key3=Integer.parseInt(tmp2); BiTreeNode found = bstree.sea

14、rchBST(key3); if (found != null) JOptionPane.showMessageDialog(null,查找成功!); else JOptionPane.showMessageDialog(null,查找失败!); /哈希表开放地址法的查找 if (command.equals(哈希表开放地址法的查找) HashTable T=null; /建立待查找的哈希表 T=new HashTable(20); Scanner sc1=new Scanner(System.in); System.out.print(请输入关键字的个数:); int n=sc1.nextI

15、nt(); System.out.print(请输入查找表中的关键字序列:); for (int i = 0; i n; i+) /输入关键字序列,并插入哈希表中 T.hashInsert(sc1.nextInt(); System.out.println(创建的哈希表为:); T.Hashdisplay(); String tmp2 = JOptionPane.showInputDialog(this,请输入待查找的关键字:); int n1 =Integer.parseInt(tmp2); RecordNode p=T.hashSearch(n1); if (p.getKey().comp

16、areTo(n1)=0) JOptionPane.showMessageDialog(null,查找成功!); else JOptionPane.showMessageDialog(null,查找失败!); /退出 if (command.equals(退出) System.exit(0); 五、详细程序清单package package1;import java.util.Scanner;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.a

17、wt.event.ActionListener;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;public class Search extends JFrame implements ActionListener private ImageIcon usIcon = new ImageIcon(src/usIco

18、n.jpg); private JButton btnSeq = new JButton(顺序表的查找); private JButton btnBinary = new JButton(有序表的查找); private JButton btnHash1 = new JButton(哈希表开放地址法的查找); private JButton btnBST = new JButton(二叉排序树的查找); private JButton btnQuit = new JButton(退出); public Search() load(); public void load() JPanel jp1

19、 =new JPanel(); JPanel jp2 =new JPanel(new BorderLayout(); GridLayout grid = new GridLayout(2,2); jp1.add(btnSeq); jp1.add(btnBinary); jp1.add(btnHash1); jp1.add(btnBST); jp2.add(jp1,BorderLayout.NORTH); jp2.add(btnQuit); jp1.setLayout(grid); this.add(new JLabel(usIcon),BorderLayout.NORTH); this.add

20、(jp2,BorderLayout.SOUTH); this.setTitle(查找); this.setSize(550,500); this.setVisible(true); this.setResizable(false); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.btnSeq.setActionCommand(顺序表的查找); this.btnBinary.setActionCommand(有序表的查找); this.btnHash1.setActionCommand(哈希表开放地址法的查找); this.btnBST.s

21、etActionCommand(二叉排序树的查找); this.btnQuit.setActionCommand(退出); btnSeq.addActionListener(this); btnBinary.addActionListener(this); btnHash1.addActionListener(this); btnBST.addActionListener(this); btnQuit.addActionListener(this); class RecordNode /记录结点类 private Comparable key; /关键字 private Object elem

22、ent; /数据元素 public Object getElement() return element; public void setElement(Object element) this.element = element; public Comparable getKey() return key; public void setKey(Comparable key) this.key = key; public RecordNode(Comparable key) /构造方法1 this.key = key; public RecordNode(Comparable key, Ob

23、ject element) /构造方法2 this.key = key; this.element = element; public String toString() /覆盖toString()方法 return + key + , + element + ; class KeyType implements Comparable /记录关键字类 private int key; /关键字 public KeyType() public KeyType(int key) this.key = key; public int getKey() return key; public void

24、setKey(int key) this.key = key; public int compareTo(KeyType another) /覆盖Comparable接口中比较关键字大小的方法 int thisVal = this.key; int anotherVal = another.key; return (thisVal anotherVal ? -1 : (thisVal = anotherVal ? 0 : 1); class SeqList /顺序查找表类 private RecordNode r; /顺序表记录结点数组 private int curlen; /顺序表长度,即

25、记录个数 / 顺序表的构造方法:构造一个存储空间容量为maxSize的顺序表 public SeqList(int maxSize) this.r = new RecordNodemaxSize; / 为顺序表分配maxSize个存储单元 this.curlen = 0; / 置顺序表的当前长度为0 / 求顺序表中的数据元素个数并由函数返回其值 public int length() return curlen; / 返回顺序表的当前长度 public int getCurlen() return curlen; public void setCurlen(int curlen) this.c

26、urlen = curlen; /* 在当前顺序表的第i个结点之前插入一个RecordNode类型的结点x,其中i取值范围为:0icurlen。如果i值不在此范围则抛出异常,当i=0时表示在表头插入一个数据元素x, 当i=curlen时表示在表尾插入一个数据元素x */ public void insert(int i, RecordNode x) throws Exception if (curlen = r.length-1) / 判断顺序表是否已满,0号存储单元不存放元素 throw new Exception(顺序表已满); if (i curlen+1) / i小于0或者大于表长 t

27、hrow new Exception(插入位置不合理); for (int j = curlen; j i; j-) rj+1 = rj ; / 插入位置及之后的元素后移 ri = x; / 插入x this.curlen+; / 表长度增1 /*顺序查找:从顺序表r1到rn的n个元素中顺序查找出关键字为key的记录,若查找成功返回其下标,否则返回-1*/ public int seqSearch(Comparable key) int i = 1, n = length(); while (i n+1 & ri.getKey().compareTo(key) != 0) i+; if (i 0) int low = 1, high = length() ; /查找范围的下界和上界 while (low 0) /给定值更小 high = mid - 1; /查找范围缩小到前半段 else low = mid + 1; /查找范围缩小到后半段 return -1; /查找不成功 /二叉树的二叉链表的结点类 class BiTr

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1