目录
目录 .................................................................................................................................................. 2 一、问题描述 ................................................................................................................................... 3 二、问题分析 ................................................................................................................................... 4 三、数据结构描述 ........................................................................................................................... 4 四、算法设计 ................................................................................................................................... 5
1、流程图 ................................................................................................................................. 5 2、具体算法 ............................................................................................................................. 5 五、详细程序清单 ........................................................................................................................... 8 六、程序运行结果 ......................................................................................................................... 19
一、问题描述
1、顺序表查找的问题描述 顺序查找又称为线性查找,它是一种最简单、最基本的查找方法。从顺序表的一端开始,依次将每一个数据元素的关键字值与给定Key进行比较,若某个数据元素的关键字值等于给定值Key,则表明查找成功;若直到所有的数据元素都比较完毕,仍找不到关键字值为Key的数据元素,则表明查找失败。 2、有序表的查找问题描述 折半查找也称为二分查找,作为二分查找对象的数据必须是顺序存储的有序表,通常假定有序表是按关键字值从小到大排列有序,即若关键字值为数值,则按数值有序;若关键字值是字符数据,则按对应的Unicode码有序。二分查找的基本思想:首先取整个有序表的中间记录的关键字值与给定值相比较,若相等,则查找成功;否则以位于中间位置的数据元素为分界点,将查找表分为左右两个子表,并判断待查找的关键字值Key是在左子表还是在右子表,再在子表中重复上述步骤,直到待查找的关键字值Key的记录或子表长度为0。 3、哈希表查找的问题描述
在哈希表上进行查找的过程是要给定要查找的关键字的值,根据构造哈希表时设定的哈希函数求得哈希地址,若此哈希地址上为空,即没有数据元素,则查找不成功;否则比较关键字,若相等,则查找成功;若不相等,则根据构造哈希表时设置的处理冲突的方法找下一个地址,知道某个位置上为空或者关键字比较相等为止。
哈希表是在关键字和存储位置之间直接建立了映像,但由于冲突的产生,哈希表的查找过程仍然是一个和关键字比较的过程。因此,仍需用平均查找长度来衡量哈希表的查找效率。查找过程中与关键字比较的次数取决于构造哈希表是选择的哈希函数和处理冲突的方法。哈希函数的“好坏”首先影响出现冲突的频率,假设哈希函数是均匀的,即它对同样一组随机的关键字出现冲突的可能性是相同的。因此哈希表的查找效率主要取决于构造哈希表时处理冲突的方法。
4、二叉排序树的查找问题描述
在顺序表的3种查找方法中,二分查找具有最高的效率,但是由于二分查找要求表中记录按关键字有序,且不能用链表做存储结构,因此当表的插入、删除操作非常频繁时,为维护表的有序性,需要移动表中很多记录。这种由移动记录引起的额外时间开销,就会抵消二分查找的优点。这里讨论的不仅是二叉排序树具有二分查找的效率,同时又便于在查找表中进行记录的增加和删除操作。 5、界面设计模块问题描述
设计一个菜单模式界面,让用户可以选择要查找的方式,界面上还有退出按钮,可以退出程序。界面要求简洁明了,便于使用。 6、按钮动作命令模块问题描述
在设计好图形界面后,就必须对相应的按钮进行事件驱动程序设计。运行Java图形用户界面程序时,程序与用户交互,比如说,在框架中显示多个按钮,当点击按钮时,就会从按钮触发一个事件。同时,查找的操作必须要有输入和输出,则需要使用对话框和命令窗口进行输入关键字和输出结果。
二、问题分析
按钮时事件的源。图形界面中一共有5个按钮,先注册按钮,再创建监听器对象,当按钮上有行为要发生时,按钮通过监听器的actionPerformed方法通知监听器。点击按钮会使监听器中actionPerformed方法被调用。
首先,点击一个按钮,从e.getActionCommand()方法从按钮返回行为命令,按钮的行为命令就是按钮的文本。调用各查找方法,之后输出查找结果。
拿“顺序表的查找”按钮来说,点击之后,如果按钮的行为命令是\顺序表的查找\,则按顺序表的特点先建立一个存储结构为20的顺序表,利用JOptionPane.showInputDialog弹出输入对话框,让用户输入表长,定义一个整形变量强制转化获取到字符串型的输入。
然后利用java.util.Scanner类从控制台读关键字的序列,存放在记录顺序表中。 利用对话框输入待查找的关键字,强制转化成KeyType型。 最后,调用顺序查找的seqSearch方法,利用JOptionPane.showMessageDialog输出运行查找结果。
三、数据结构描述
public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); ........
//顺序表的查找 if (command.equals(\顺序表的查找\ ......... }
//有序表的动作实现 if (command.equals(\有序表的查找\ ............. }
//二叉排序树的动作实现 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 tmp1 = JOptionPane.showInputDialog(this, \请输入查找表的表长:\ int n =Integer.parseInt(tmp1);