数据结构(查找)

目录

引言

[一、顺序查找(Sequential Search)](#一、顺序查找(Sequential Search))

原理:

C语言实现:

复杂度分析:

[二、二分查找(Binary Search)](#二、二分查找(Binary Search))

原理:

[C语言实现(循环版) :](#C语言实现(循环版) :)

递归版实现:

复杂度分析:

[三、插值查找(Interpolation Search)](#三、插值查找(Interpolation Search))

原理:

C语言实现:

复杂度分析:

[四、分块查找(Block Search)](#四、分块查找(Block Search))

原理:

C语言实现:

复杂度分析:

[五、哈希查找(Hash Search)](#五、哈希查找(Hash Search))

原理:

简单哈希表实现(开放寻址法):

复杂度分析:

六、算法对比与选择建议

七、实际应用示例

八、总结


引言

查找(Search)是计算机科学中最基础且高频的操作之一。无论是数据库查询、文件检索,还是游戏中的资源匹配,都离不开高效的查找算法。本文将以C语言为例,深入解析五种经典查找算法的实现原理、时间复杂度及适用场景,并附完整代码示例。


一、顺序查找(Sequential Search)

原理:

顺序查找是最朴素的查找方式,逐个遍历数组元素,直到找到目标值或遍历完整个数组。

C语言实现:
cs 复制代码
int sequential_search(int arr[], int n, int target) 
{
    for (int i = 0; i < n; i++) 
    {
        if (arr[i] == target) 
        {
            return i; // 找到返回索引
        }
    }
    return -1; // 未找到
}
复杂度分析:
  • 时间复杂度:O(n)

  • 空间复杂度:O(1)

  • 适用场景:数据无序、小规模数据集。


二、二分查找(Binary Search)

原理:

二分查找要求数据有序,通过不断缩小搜索范围(每次比较中间元素),以对数时间定位目

C语言实现(循环版) :
cs 复制代码
int binary_search(int arr[], int n, int target) 
{
    int left = 0, right = n - 1;
    while (left <= right) 
    {
        int mid = left + (right - left) / 2; // 避免整数溢出
        if (arr[mid] == target) 
        {
            return mid;
        } 
        else if (arr[mid] < target) 
        {
            left = mid + 1;
        } 
        else 
        {
            right = mid - 1;
        }
    }
    return -1;
}
递归版实现:
cs 复制代码
int binary_search_recursive(int arr[], int left, int right, int target) 
{
    if (left > right) return -1;
    int mid = left + (right - left) / 2;
    if (arr[mid] == target) 
    {
        return mid;
    } 
    else if (arr[mid] < target) 
    {
        return binary_search_recursive(arr, mid + 1, right, target);
    } 
    else 
    {
        return binary_search_recursive(arr, left, mid - 1, target);
    }
}
复杂度分析:
  • 时间复杂度:O(log n)

  • 空间复杂度:循环版O(1),递归版O(log n)(栈空间)

  • 适用场景有序数组,静态数据集(无频繁插入/删除)。


三、插值查找(Interpolation Search)

原理:

基于二分查找优化,通过数据分布预测目标位置,适用于数据均匀分布的有序数组。

C语言实现:
cs 复制代码
int interpolation_search(int arr[], int n, int target) 
{
    int low = 0, high = n - 1;
    while (low <= high && target >= arr[low] && target <= arr[high]) 
    {
        int pos = low + ((target - arr[low]) * (high - low)) / (arr[high] - arr[low]);
        if (arr[pos] == target) 
        {
            return pos;
        } 
        else if (arr[pos] < target) 
        {
            low = pos + 1;
        }
         else 
        {
            high = pos - 1;
        }
    }
    return -1;
}
复杂度分析:
  • 平均时间复杂度:O(log log n)(数据均匀分布时)

  • 最坏时间复杂度:O(n)

  • 适用场景 :有序且均匀分布的大规模数据集。


四、分块查找(Block Search)

原理:

将数据分为若干块,块内无序但块间有序,通过先定位块,再块内顺序查找提高效率。

C语言实现:
cs 复制代码
typedef struct 
{
    int max_val;  // 块内最大值
    int start;    // 块起始索引
    int end;      // 块结束索引
} Block;

int block_search(int arr[], int n, int target, Block blocks[], int block_num) 
{
    // 1. 定位目标块
    int target_block = -1;
    for (int i = 0; i < block_num; i++) 
    {
        if (target <= blocks[i].max_val) 
        {
            target_block = i;
            break;
        }
    }
    if (target_block == -1) return -1;

    // 2. 块内顺序查找
    for (int i = blocks[target_block].start; i <= blocks[target_block].end; i++) 
    {
        if (arr[i] == target) 
        {
            return i;
        }
    }
    return -1;
}
复杂度分析:
  • 时间复杂度:O(√n)(理想分块大小)

  • 适用场景:动态数据(可灵活调整分块),如数据库索引。


五、哈希查找(Hash Search)

原理:

通过哈希函数将键值映射到存储位置,理想情况下可实现O(1)时间查找。

简单哈希表实现(开放寻址法):
cs 复制代码
#define SIZE 10

int hash_function(int key)
{
	return key % SIZE;
}

int hash_search(int hash_table[], int key)
{
	int index = hash_function(key);
	int start = index;
	do {
		if (hash_table[index] == key)
		{
			return index;
		}
		else if (hash_table[index] == -1)
		{
			return -1; // 空位说明不存在
		}
		index = (index + 1) % SIZE;
	} while (index != start);
	return -1;
}
复杂度分析:
  • 平均时间复杂度:O(1)

  • 最坏时间复杂度:O(n)(哈希冲突严重时)

  • 适用场景:需要快速查找、插入、删除的场景,如缓存系统。


六、算法对比与选择建议


七、实际应用示例

场景:学生成绩管理系统

  • 若成绩表无序 且数据量小 → 顺序查找

  • 若成绩表按学号有序二分查找

  • 若需频繁按姓名查找 → 建立哈希表(以姓名为键)


八、总结

查找算法的选择需综合考虑数据特征 (有序性、分布情况)和操作需求 (查询频率、是否动态更新)。C语言作为贴近硬件的语言,能清晰展现算法底层逻辑,建议通过手写代码加深理解。最后,请记住:没有最好的算法,只有最适合场景的算法

相关推荐
布莱克60516 分钟前
理解B+树:原理、特性与应用场景
数据结构·数据库·mysql
叠层归一研究院16 分钟前
如何用程序搭建一个 AGI 种子系统(三):生长如何对接物理与数学宇宙
人工智能·python·算法·机器学习·transformer·agi
show43337 分钟前
2026小程序端AI智能优化技术实践:转文字后自动纠错+润色+分段算法分析
人工智能·算法·小程序
平生不晚1 小时前
在 SVG 体系里画一条任意的线
前端·算法
打工陈1 小时前
电路理论知识学习--(4)RC、LC、LR低通滤波对比
学习·智能硬件
Hhy_11072 小时前
《C++深度解构02》类和对象(上)——定义规范、内存对齐与 this 指针全解
c语言·开发语言·c++·学习·visual studio
我爱cope2 小时前
【计算机网络 | 数据链路层3:MAC 地址是什么?它和 IP 地址有什么区别?】
学习·tcp/ip·计算机网络·智能路由器·数据链路层
晚风叙码2 小时前
C++哈希表实现:开放定址法和链地址法 (哈希桶)
数据结构·c++·哈希算法·散列表
imaol12 小时前
哈希表--数据结构
数据结构·散列表
电子云与长程纠缠2 小时前
UE5 Lyra PocketWorld进行3D内容UI预览 - 下
开发语言·学习·游戏·ui·ue5