首页 > 编程语言 >查找算法——顺序查找

查找算法——顺序查找

时间:2023-08-13 15:33:14浏览次数:36  
标签:Node 顺序 return next 算法 查找 key public

基于无序链表的顺序查找:在查找中我们一个一个地顺序遍历符号表中的所有键并使用equals()方法来寻找与被查找的键匹配的键。

无序链表查找的性能

上面get()方法中查找第一个键需要1次比较,查找第二个需要2次比较,如此这般,平均比较次数为(1+2+...+N)/N,也就是(N+1)/2~N/2。比较的总次数和查找次数与插入次数的乘积成正比,所以基于链表的实现以及顺序查找是非常低效的。

1、顺序查找基于无序链表

public class SequentialSearchST<Key, Value> {
    
    private Node first;
    Node next;
    private class Node{
        Key key;
        Value val;
        Node next;

        public Node(Key key, Value val, Node next) {
            this.key = key;
            this.val = val;
            this.next = next;
        }
    }

    public SequentialSearchST(Node first, Node next) {
        this.first = first;
        this.next = next;
    }

    public Value get(Key key) {
        for (Node x = first; x != null; x = x.next) {
            if (key.equals(x.key)) return x.val;
        }
        return null;
    }

    public void put(Key key, Value value) {
        for (Node x = first; x != null; x = x.next) {
            if (key.equals(x.key)) {
                x.val = value;
                return;
            }
            first = new Node(key, value, first);
        }
    }
}

2、二分查找基于有序数组

public class BinarySearchST<Key extends Comparable<Key>, Value> {

    private Key[] keys;
    private Value[] values;
    private int N;

    public BinarySearchST(int capacity) {
        keys = (Key[]) new Comparable[capacity];
        values = (Value[]) new Object[capacity];
    }

    public int size() {
        return N;
    }

    public Value get(Key key) {
        if (key == null) return null;
        int i = rank(key);
        if (i < N && keys[i].compareTo(key) == 0) {
            return values[i];
        } else {
            return null;
        }
    }

    public int rank(Key key) {
        int lo = 0, hi = N - 1;
        while (lo <= hi) {
            int mid = lo + (hi - lo) / 2;
            int cmp = key.compareTo(keys[mid]);
            if (cmp < 0) hi = mid - 1;
            else if (cmp > 0) lo = mid + 1;
            else return mid;
        }
        return lo;
    }

    public void put(Key key, Value val) {
        int i = rank(key);
        if (i < N && keys[i].compareTo(key) == 0) {
            values[i] = val;
            return;
        }
        for (int j = N; j > i; j--) {
            keys[j] = keys[j - 1];
            values[j] = values[j - 1];
        }
        keys[i] = key;
        values[i] = val;
        N++;
    }
}

标签:Node,顺序,return,next,算法,查找,key,public
From: https://blog.51cto.com/u_11906056/7067569

相关文章

  • 《算法》——深度优先搜索
    定义:图是由一组顶点和一组能够将两个顶点相连的边组成的相关术语:当两个顶点通过一条边相连时,我们称这两个顶点是相邻的,并称这条边依附于这两个顶点某个顶点的度数即为依附于它的边的总数。子图是由一幅图的所有边的一个子集(以及它们所依附的所有的顶点)组成的图。在图......
  • 《算法》——广度优先搜索与找寻找路径
    单点路径问题在图的处理领域中十分重要,从输入流中读取一个图从从命令行得到一个起点,然后打印从起点到与它连通的每个顶点之间的一条路径。深度优先找路径下面扩展了尝试优先搜索代码,添加一一个实例变量edgeTo[]整型数组来起到Tremaux搜索中绳子的作用,这个数组可以找到从每个与......
  • 分治算法——241. 为运算表达式设计优先级
    分治思路:对于一个算式来说,总是可以根据运算符分为左右两部分算式,接着分别计算结果并合并;每一个结果都是一个数组,包含这个算式的所有可能结果,计算时将左右两部分排列组合;递归的终点是字符串是纯数字(即分到一个算式中只剩下一个数字),直接返回。 比如示例中的2*3-4*5,有下面的......
  • Raft 算法
    论文《InSearchofanUnderstandableConsensusAlgorithm》,发表于2014年相比于Paxos,Raft最大的特性就是易于理解。为了达到这个目标,Raft主要做了两方面的事情:问题分解:把共识算法分为三个子问题,分别是领导者选举(leaderlection)、日志复制(logreplication)、安全性(......
  • C++STL库 二分查找,以及对set集合进行二分查找,来源于”leetcode7022. 限制条件下元素之
    C++的头文件<algorithm>中有用于二分查找的函数,lower_bound()、upper_bound()以及binary_search():lower_bound():返回大于等于目标值的第一个位置upper_bound():返回大于目标值的第一个位置,binary_search():若目标值存在则返回true,否则返回false参数列表:(起始位置,结束位置,目标值) ......
  • 文心一言 VS 讯飞星火 VS chatgpt (75)-- 算法导论7.2 4题
    四、如果用go语言,银行一般会按照交易时间来记录某一账户的交易情况。但是,很多人却喜欢收到的银行对账单是按照支票号码的顺序来排列的。这是因为,人们通常都是按照支票号码的顺序来开出支票的,而商人也通常都是根据支票编号的顺序兑付支票。这一问题是将按交易时间排序的序列转换成按......
  • #yyds干货盘点# LeetCode程序员面试金典:查找和最小的 K 对数字
    1.简述:给定两个以 非递减顺序排列 的整数数组 和  , 以及一个整数  。nums1nums2k定义一对值 ,其中第一个元素来自 ,第二个元素来自  。(u,v)nums1nums2请找到和最小的  个数对 , k(u1,v1) (u2,v2)(uk,vk) 示例1:输入:nums1=[1,7,11],nums2=[2,4,6],k=3......
  • 文心一言 VS 讯飞星火 VS chatgpt (75)-- 算法导论7.2 4题
    四、如果用go语言,银行一般会按照交易时间来记录某一账户的交易情况。但是,很多人却喜欢收到的银行对账单是按照支票号码的顺序来排列的。这是因为,人们通常都是按照支票号码的顺序来开出支票的,而商人也通常都是根据支票编号的顺序兑付支票。这一问题是将按交易时间排序的序列转换成......
  • 算法刷题:数组题(持续更)
    算法刷题系列:算法刷题:链表题(持续更)力扣链接:删除有序数组中的重复项删除排序链表中的重复元素移除元素移除链表元素两数之和反转字符串反转链表验证回文串验证回文串II目录快速排序原理代码实现快慢指针注意事项异步移动删除有序数组的重复项代码实现对比链表的删......
  • C#快速排序算法
    快速排序实现原理快速排序(QuickSort)是一种常用的排序算法,它基于分治的思想,通过将一个无序的序列分割成两个子序列,并递归地对子序列进行排序,最终完成整个序列的排序。其基本思路如下:选择数组中的一个元素作为基准(pivot)。将数组中小于等于基准的元素放在基准的左边,将大于基......