当前位置: 首页 > news >正文

数据结构-查找

一、查找的基本概念

   查找是指在一个给定的数据结构中找到满足特定条件的元素。常见的查找算法有基于线性表的查找、基于树的查找和基于哈希的查找等。

二、基于线性表的查找法

顺序查找法

  顺序查找法是一种简单的查找方法,它从表的一端开始,依次将每个元素与目标值进行比较,直到找到目标值或遍历完整个表。

折半查找法

  折半查找法适用于有序表。它将查找区间一分为二,判断目标值在左半区间还是右半区间,然后在对应的区间继续查找,直到找到目标值或区间缩小为0。

分块查找法

   分块查找法将表分成若干块,每一块内元素不必有序,但各块之间必须有序。查找时,先确定目标值所在的块,再在块内进行查找

三、基于树的查找法

二叉排序树

   二叉排序树是一种动态查找表,它的结构在查找过程中动态变化。每个节点的左子树只包含小于该节点的元素,右子树只包含大于该节点的元素。

平衡二叉排序树

   平衡二叉排序树是在二叉排序树的基础上,通过旋转操作保持树的平衡,以保证查找效率。

B树

  B树是一种多路平衡查找树,它允许多个子节点。B树的每个节点可以存储多个键值,并且保持树的平衡。

四、计算式查找法——哈希法

哈希函数的构造方法

   哈希函数将关键字映射到哈希表的地址。常见的构造方法有直接定址法、数字分析法、平方取中法、折叠法、随机数法等。

处理冲突的方法

   当不同的关键字映射到同一个哈希地址时,就会产生冲突。常见的处理冲突的方法有开放定址法、链地址法等。

哈希表的查找过程

   哈希查找的过程包括构建哈希表和在哈希表中查找元素。查找时,通过哈希函数计算地址,然后在该地址处查找元素。

哈希法性能分析

   哈希查找的平均查找长度取决于哈希表的装填因子和处理冲突的方法。理想情况下,哈希查找的平均查找长度接近于1。

五、总结核心知识点

查找方法时间性能分析空间性能分析应用场景
顺序查找O(n)O(1)无序表的简单查找
折半查找O(log n)O(1)有序表的高效查找
分块查找O(√n)O(√n)有序分块表的查找
二叉排序树O(h)(h为树高)O(n)动态查找,需频繁插入和删除
平衡二叉树O(log n)O(n)需保持动态平衡的高效查找
B树O(log n)O(n)大规模数据的高效查找
哈希查找O(1)(理想情况)O(n)需快速查找的场景,允许一定冲突

六、代码实现

以下分别用 C 语言、C++、Java 和 Python 实现顺序查找、折半查找和哈希查找。

C 语言实现

#include <stdio.h>// 顺序查找
int SequentialSearch(int arr[], int n, int target) {for (int i = 0; i < n; i++) {if (arr[i] == target) { // 如果找到目标值return i; // 返回元素的索引}}return -1; // 未找到返回-1
}// 折半查找(要求数组有序)
int BinarySearch(int arr[], int n, int target) {int low = 0, high = n - 1;while (low <= high) {int mid = (low + high) / 2;if (arr[mid] == target) { // 如果找到目标值return mid; // 返回元素的索引} else if (arr[mid] < target) {low = mid + 1; // 在右半区间继续查找} else {high = mid - 1; // 在左半区间继续查找}}return -1; // 未找到返回-1
}// 哈希查找(简单示例)
#define HASHTABLE_SIZE 10
int HashTable[HASHTABLE_SIZE];// 哈希函数
int HashFunction(int key) {return key % HASHTABLE_SIZE;
}// 插入哈希表
void InsertHashTable(int key) {int address = HashFunction(key);HashTable[address] = key; // 插入元素
}// 在哈希表中查找
int SearchHashTable(int key) {int address = HashFunction(key);if (HashTable[address] == key) { // 如果找到目标值return address; // 返回元素的索引}return -1; // 未找到返回-1
}int main() {int arr[] = {1, 3, 5, 7, 9};int n = sizeof(arr) / sizeof(arr[0]);printf("顺序查找 5 的索引:%d\n", SequentialSearch(arr, n, 5));printf("折半查找 5 的索引:%d\n", BinarySearch(arr, n, 5));// 哈希查找示例InsertHashTable(5);InsertHashTable(15);printf("哈希查找 5 的索引:%d\n", SearchHashTable(5));printf("哈希查找 15 的索引:%d\n", SearchHashTable(15));return 0;
}

C++ 实现

​
#include <iostream>
#include <vector>
using namespace std;// 顺序查找
int SequentialSearch(vector<int> arr, int target) {for (int i = 0; i < arr.size(); i++) {if (arr[i] == target) { // 如果找到目标值return i; // 返回元素的索引}}return -1; // 未找到返回-1
}// 折半查找(要求数组有序)
int BinarySearch(vector<int> arr, int target) {int low = 0, high = arr.size() - 1;while (low <= high) {int mid = (low + high) / 2;if (arr[mid] == target) { // 如果找到目标值return mid; // 返回元素的索引} else if (arr[mid] < target) {low = mid + 1; // 在右半区间继续查找} else {high = mid - 1; // 在左半区间继续查找}}return -1; // 未找到返回-1
}// 哈希查找(简单示例)
const int HASHTABLE_SIZE = 10;
int HashTable[HASHTABLE_SIZE] = {0};// 哈希函数
int HashFunction(int key) {return key % HASHTABLE_SIZE;
}// 插入哈希表
void InsertHashTable(int key) {int address = HashFunction(key);HashTable[address] = key; // 插入元素
}// 在哈希表中查找
int SearchHashTable(int key) {int address = HashFunction(key);if (HashTable[address] == key) { // 如果找到目标值return address; // 返回元素的索引}return -1; // 未找到返回-1
}int main() {vector<int> arr = {1, 3, 5, 7, 9};cout << "顺序查找 5 的索引:" << SequentialSearch(arr, 5) << endl;cout << "折半查找 5 的索引:" << BinarySearch(arr, 5) << endl;// 哈希查找示例InsertHashTable(5);InsertHashTable(15);cout << "哈希查找 5 的索引:" << SearchHashTable(5) << endl;cout << "哈希查找 15 的索引:" << SearchHashTable(15) << endl;return 0;
}​

Java 实现

​
import java.util.Arrays;public class SearchExample {// 顺序查找public static int sequentialSearch(int[] arr, int target) {for (int i = 0; i < arr.length; i++) {if (arr[i] == target) { // 如果找到目标值return i; // 返回元素的索引}}return -1; // 未找到返回-1}// 折半查找(要求数组有序)public static int binarySearch(int[] arr, int target) {int low = 0, high = arr.length - 1;while (low <= high) {int mid = (low + high) / 2;if (arr[mid] == target) { // 如果找到目标值return mid; // 返回元素的索引} else if (arr[mid] < target) {low = mid + 1; // 在右半区间继续查找} else {high = mid - 1; // 在左半区间继续查找}}return -1; // 未找到返回-1}// 哈希查找(简单示例)private static final int HASHTABLE_SIZE = 10;private static int[] hashTable = new int[HASHTABLE_SIZE];// 哈希函数private static int hashFunction(int key) {return key % HASHTABLE_SIZE;}// 插入哈希表public static void insertHashTable(int key) {int address = hashFunction(key);hashTable[address] = key; // 插入元素}// 在哈希表中查找public static int searchHashTable(int key) {int address = hashFunction(key);if (hashTable[address] == key) { // 如果找到目标值return address; // 返回元素的索引}return -1; // 未找到返回-1}public static void main(String[] args) {int[] arr = {1, 3, 5, 7, 9};System.out.println("顺序查找 5 的索引:" + sequentialSearch(arr, 5));System.out.println("折半查找 5 的索引:" + binarySearch(arr, 5));// 哈希查找示例insertHashTable(5);insertHashTable(15);System.out.println("哈希查找 5 的索引:" + searchHashTable(5));System.out.println("哈希查找 15 的索引:" + searchHashTable(15));}
}​

Python 实现

​
# 顺序查找
def sequential_search(arr, target):for index, value in enumerate(arr):if value == target:  # 如果找到目标值return index  # 返回元素的索引return -1  # 未找到返回-1# 折半查找(要求数组有序)
def binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:  # 如果找到目标值return mid  # 返回元素的索引elif arr[mid] < target:low = mid + 1  # 在右半区间继续查找else:high = mid - 1  # 在左半区间继续查找return -1  # 未找到返回-1# 哈希查找(简单示例)
HASHTABLE_SIZE = 10
hash_table = [None] * HASHTABLE_SIZE# 哈希函数
def hash_function(key):return key % HASHTABLE_SIZE# 插入哈希表
def insert_hash_table(key):address = hash_function(key)hash_table[address] = key  # 插入元素# 在哈希表中查找
def search_hash_table(key):address = hash_function(key)if hash_table[address] == key:  # 如果找到目标值return address  # 返回元素的索引return -1  # 未找到返回-1if __name__ == "__main__":arr = [1, 3, 5, 7, 9]print("顺序查找 5 的索引:", sequential_search(arr, 5))print("折半查找 5 的索引:", binary_search(arr, 5))# 哈希查找示例insert_hash_table(5)insert_hash_table(15)print("哈希查找 5 的索引:", search_hash_table(5))print("哈希查找 15 的索引:", search_hash_table(15))​

七、总结

   查找算法是数据结构中的重要部分,很重要哦!还有排序!不同的查找算法适用于不同的场景。通过本文的介绍,希望能帮助读者理解和掌握常见的查找算法,并能根据实际需求选择合适的查找方法。

相关文章:

  • 在vue项目中实现svn日志打印
  • LeetCode hot 100—最长有效括号
  • HTML应用指南:利用GET请求获取微博签到位置信息
  • 中介者模式:解耦对象间复杂交互的设计模式
  • 虚拟机详解
  • 音视频之H.265/HEVC环路后处理
  • 修改了Element UI中组件的样式,打包后样式丢失
  • 2194出差-节点开销Bellman-ford/图论
  • Spring AI 核心概念
  • Atlas 800I A2 离线部署 DeepSeek-R1-Distill-Llama-70B
  • 使用钉钉机器人推送系统内部的ERP停机维护公告
  • Mysql的深度分页查询优化
  • 鲲鹏麒麟搭建Docker仓库
  • DeepSeek 部署中的常见问题及解决方案全解析
  • DrissionPage 请求一次换一个代理(不重启chrome)
  • 快速上手GO的net/http包,个人学习笔记
  • CentOS 7 磁盘阵列搭建与管理全攻略
  • 【计算机视觉】CV实战项目- 深度解析FaceAI:一款全能的人脸检测与图像处理工具库
  • 基于霍尔效应传感器的 BLDC 电机梯形控制方案详解
  • 从零开始学习SLAM|技术路线
  • 著名茶叶专家谢丰镐逝世,享年95岁
  • 神十九乘组视频祝福第十个中国航天日,展望中华民族登月梦圆
  • 外卖江湖战火重燃,骑手、商家、消费者在“摇摆”什么?
  • 视频丨习近平同阿塞拜疆总统会谈:两国建立全面战略伙伴关系
  • 言短意长|大学校门到底应不应该开放?
  • 泰国总理佩通坦:推迟与美国的关税谈判