持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
比较分析各种查找算法
(1)在顺序查找中,引入了“哨兵”的概念,哨兵可以避免进行不必要的判断
(2)折半查找相比顺序查找快了一点,折半查找可以对比二叉排序树,但使用折半查找是要求给出的数据必须是有序的。我觉得可以结合排序算法来使用这个折半查找算法
(3)哈希算法比前面两种查找都快,因为是通过函数映射的,但是关键就是映射函数如何设计和如何处理冲突。
比较分析各种排序算法
1.在实现排序算法的过程种,要注意数组存储的起始索引值是从0还是1开始
2.在排序种,有几种不同类型的排序,而不同类型排序中都会有一种最基本的排序,例如插入排序类,直接插入排序用我们在直观的方式进行排序,而希尔排序则是在插入排序的基础上提出改进。
- 不同类型的排序实现方式是不同的,交换类和选择类排序在每一趟排序后都会确定一个数据的最终位置
设计一个自己的 Hash 函数和一个冲突解决机制
我设计的Hash函数采用的是直接寻址法,而解决冲突的办法是拉链法。在设计Hash函数时,我设计的思路参考了图中的领接表,我认为他的数据结构和这个拉链法很相似,由数组加链表结合。如下是自己写的代码并通过测试:
public class Hash {
//链表的结构
class HashNode {
int column;
HashNode next;
public HashNode(int paraColumn) {
column = paraColumn;
next = null;
}
}
int length;
HashNode[] data;
public Hash(int[] paraArray,int paraLenght) {
length = paraLenght;
data = new HashNode[paraLenght];
HashNode tempNode,tempPreviousNode;
int tempPosition;
//采用直接地址法构造hash函数 并用拉链法解决冲突
for (int i = 0; i < paraLenght; i++) {
data[i] = new HashNode(i);
tempPreviousNode = data[i];
for (int j = 0; j < paraArray.length; j++) {
tempPosition = paraArray[j] % paraLenght;
//,我对取模值相同的在外层一个for一次搞定
if (tempPosition == i) {
tempNode = new HashNode(paraArray[j]);
tempPreviousNode.next = tempNode;
tempPreviousNode = tempNode;
}
}
}
//打印输出链表法的值
HashNode hashNode;
for (int i = 0; i < paraLenght; i++) {
hashNode = data[i];
String hashString = " ";
while (hashNode != null) {
hashString = hashString + " " + hashNode.column ;
hashNode = hashNode.next;
}
System.out.println(hashString);
}
}
public static void main(String args[]) {
int[] tempUnsortedKeys = { 16, 33, 38, 69, 57, 95, 86 };
Hash hash = new Hash(tempUnsortedKeys, 8);
}
}
运行结果:
初始数据: 16, 33, 38, 69, 57, 95, 86
0 16
1 33 57
2
3
4
5 69
6 38 86
7 95