java学习28

52 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

比较分析各种查找算法

image.png (1)在顺序查找中,引入了“哨兵”的概念,哨兵可以避免进行不必要的判断

(2)折半查找相比顺序查找快了一点,折半查找可以对比二叉排序树,但使用折半查找是要求给出的数据必须是有序的。我觉得可以结合排序算法来使用这个折半查找算法

(3)哈希算法比前面两种查找都快,因为是通过函数映射的,但是关键就是映射函数如何设计和如何处理冲突。

比较分析各种排序算法

image.png 1.在实现排序算法的过程种,要注意数组存储的起始索引值是从0还是1开始

2.在排序种,有几种不同类型的排序,而不同类型排序中都会有一种最基本的排序,例如插入排序类,直接插入排序用我们在直观的方式进行排序,而希尔排序则是在插入排序的基础上提出改进。

  1. 不同类型的排序实现方式是不同的,交换类和选择类排序在每一趟排序后都会确定一个数据的最终位置

设计一个自己的 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