数据结构与算法 查找篇(详细、kotlin):线性查找,二分查找,哈希查找,二叉排序树

线性查找(Linear Search):

线性查找(Linear Search)是一种简单直观的查找算法,其思想是从数据集的开头开始逐个比较目标元素与数据集中的元素,直到找到目标元素或遍历完整个数据集。

fun linearSearch(array: Array<Int>, target: Int): Int {
    for (i in array.indices) {
        if (array[i] == target) {
            return i
        }
    }
    return -1
}

二分查找(Binary Search):

二分查找(Binary Search)是一种高效的查找算法,适用于有序数组或有序列表这样的数据结构。其基本思想是通过每次将查找范围缩小为原来的一半,来快速定位目标元素的位置。

fun binarySearch(array: Array<Int>, target: Int): Int {
    var left = 0
    var right = array.size - 1

    while (left <= right) {
        val mid = (left + right) / 2
        when {
            array[mid] == target -> return mid
            array[mid] < target -> left = mid + 1
            else -> right = mid - 1
        }
    }
    return -1 }

哈希查找(Hashing):

哈希查找(Hashing)是一种基于哈希函数的查找算法,它通过将查找键(Key)映射到哈希表(Hash Table)中的一个位置来快速定位目标元素。

val hashMap = HashMap<String, Int>()
hashMap["key1"] = 1
hashMap["key2"] = 2
hashMap["key3"] = 3

val value = hashMap["key2"]

二叉查找树(Binary Search Tree):

二叉排序树(Binary Search Tree)是一种基于二叉树的数据结构,它具有以下性质:

  • 对于任意节点,其左子树中的所有节点的值都小于该节点的值。
  • 对于任意节点,其右子树中的所有节点的值都大于该节点的值。
  • 左右子树也分别为二叉排序树。

基于这种性质,二叉排序树的查找操作可以通过比较节点的值,并根据节点值的大小选择向左子树或右子树进行进一步查找,直到找到目标值或遍历到空节点。

class TreeNode(var value: Int) {
    var left: TreeNode? = null
    var right: TreeNode? = null
}

fun searchInBinarySearchTree(root: TreeNode?, target: Int): TreeNode? {
    var current = root
    while (current != null && current.value != target) {
        current = if (target < current.value) {
            current.left
        } else {
            current.right
        }
    }
    return current
}

实际应用场景对比

1. 线性查找:

  • 小型数据集:当数据集较小且无序时,线性查找是一种简单而直观的查找方法。例如,在一个小型通讯录中查找某个人的联系信息。
  • 顺序存储结构:线性查找适用于顺序存储结构,如数组。例如,在一个未排序的整数数组中查找特定元素。

2. 二分查找:

  • 有序数组:二分查找适用于已排序的数组,可以快速定位目标元素。例如,在一个包含大量数据的有序数组中查找某个特定的值。
  • 折半查找:二分查找也适用于其他有序数据结构,如二叉排序树(Binary Search Tree)等。例如,在一个二叉排序树中查找特定的节点。

3. 哈希查找:

  • 键值对存储:哈希查找适用于键值对存储的场景,可以快速根据键查找对应的值。例如,在一个存储用户信息的散列表中,根据用户ID查找用户信息。
  • 数据缓存:哈希查找常用于缓存系统,可以通过哈希函数将数据映射到缓存中的索引位置,以快速查找和访问数据。

4. 二叉排序树(Binary Search Tree):

  • 有序插入和查找:二叉排序树适用于需要频繁的插入和查找操作,并保持有序的场景。例如,在一个需要动态维护有序数据集的情况下,可以使用二叉排序树进行高效的插入和查找操作。
  • 范围查询:二叉排序树还支持范围查询,可以快速找到满足某个范围条件的数据。例如,在一个存储时间序列数据的二叉排序树中,可以快速找到某个时间范围内的数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiet_h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值