数据结构:五种查找算法

查找算法是计算机科学中用于在数据结构中查找特定元素的算法。以下是一些常见的查找算法以及它们在C语言中的实现示例:

  1. 线性查找(Linear Search):
    线性查找是通过遍历数组中的每个元素来查找特定值的方法。它是最简单的查找算法之一。

    int linear_search(int arr[], int n, int x) {
        int i;
        for (i = 0; i < n; i++) {
            if (arr[i] == x) {
                return i; // 返回元素的位置
            }
        }
        return -1; // 如果没有找到返回-1
    }
    
  2. 二分查找(Binary Search):
    二分查找是在有序数组中查找特定元素的一种非常高效的算法。它通过比较数组中间的元素来工作,如果中间元素不是要找的元素,则根据该元素与目标值的大小关系,决定是在左半部分还是在右半部分继续查找。

    int binary_search(int arr[], int l, int r, int x) {
        if (r >= l) {
            int mid = l + (r - l) / 2;
            if (arr[mid] == x) {
                return mid;
            } else if (arr[mid] > x) {
                return binary_search(arr, l, mid - 1, x);
            } else {
                return binary_search(arr, mid + 1, r, x);
            }
        }
        return -1;
    }
    
  3. 插值查找(Interpolation Search):
    插值查找是二分查找的一种改进,它利用数据分布的特性来减少搜索范围。它假设数据在某个范围内均匀分布。

    int interpolation_search(int arr[], int n, int x) {
        int low = 0, high = (n - 1);
        while (low <= high && x >= arr[low] && x <= arr[high]) {
            if (low == high) {
                if (arr[low] == x) return low;
                break;
            }
            int pos = low + (((double)(high - low) / (arr[high] - arr[low])) * (x - arr[low]));
            if (arr[pos] == x) {
                return pos;
            }
            if (arr[pos] < x) {
                low = pos + 1;
            } else {
                high = pos - 1;
            }
        }
        return -1;
    }
    
  4. 斐波那契查找(Fibonacci Search):
    斐波那契查找是基于斐波那契数列的查找算法,它将查找区间分成不确定的两部分,类似于二分查找。

    int fibonacci_search(int arr[], int n, int x) {
        int fibMMm2 = 0, fibMMm1 = 1, fibM = fibMMm2 + fibMMm1;
        while (fibM < n) {
            fibMMm2 = fibMMm1;
            fibMMm1 = fibM;
            fibM = fibMMm2 + fibMMm1;
        }
        int offset = -1;
        while (fibM > 1) {
            int i = min(offset + fibMMm2, n - 1);
            if (arr[i] < x) {
                fibM = fibMMm1;
                fibMMm1 = fibMMm2;
                fibMMm2 = fibM - fibMMm1;
                offset = i;
            } else if (arr[i] > x) {
                fibM = fibMMm2;
                fibMMm1 = fibMMm1 - fibMMm2;
                fibMMm2 = fibM - fibMMm1;
            } else {
                return i;
            }
        }
        if(fibMMm1 && arr[offset + 1] == x) return offset + 1;
        return -1;
    }
    
  5. 哈希查找(Hash Search):
    哈希查找通常不是通过比较元素本身来查找,而是通过使用哈希表的键值来快速定位元素。

    // 哈希查找通常需要一个哈希表和哈希函数,这里只是一个简单的示例
    int hash_search(int key, int hash_table[], int size) {
        int index = key % size; // 使用简单的哈希函数
        if (hash_table[index] == key) {
            return index; // 找到元素
        }
        return -1; // 没有找到
    }
    

请注意,这些代码示例仅用于说明查找算法的基本概念,实际应用中可能需要根据具体情况进行调整。例如,哈希查找需要考虑哈希冲突和动态扩容等问题。

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
B树是一种平衡查找树,其特点是能够在相对较短的时间内完成查找、插入和删除操作,因此在文件系统和数据库系统中被广泛应用。 B树的定义如下: 1.每个节点最多有m个子节点; 2.除根节点和叶子节点外,其他节点至少有ceil(m/2)个子节点; 3.如果根节点不是叶子节点,则至少有两个子节点; 4.所有叶子节点都在同一层次上。 B树的基本操作包括:查找、插入和删除。 查找操作与二叉查找树类似,从根节点开始递归查找。插入和删除操作需要维护B树的平衡性,即保证每个节点的子节点数在一定范围内。 插入操作的过程如下: 1.从根节点开始查找,找到合适的叶子节点; 2.如果叶子节点未满,则直接插入; 3.如果叶子节点已满,则进行节点分裂,将中间的关键字上移到父节点,并将左右节点分别作为父节点的子节点。 删除操作的过程如下: 1.从根节点开始查找,找到待删除的关键字所在的节点; 2.如果待删除的关键字在叶子节点上,直接删除; 3.如果待删除的关键字在非叶子节点上,找到它的前驱或后继关键字,用它来代替待删除的关键字,并删除前驱或后继关键字。 B树的性能优于二叉查找树,因为B树的每个节点可以存储多个关键字,从而减少查找路径的长度。B树的平衡性也能保证树的高度相对较小,从而提高查找、插入和删除操作的效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只天蝎

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

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

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

打赏作者

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

抵扣说明:

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

余额充值