数据结构-查找
一、查找的基本概念
查找是指在一个给定的数据结构中找到满足特定条件的元素。常见的查找算法有基于线性表的查找、基于树的查找和基于哈希的查找等。
二、基于线性表的查找法
顺序查找法
顺序查找法是一种简单的查找方法,它从表的一端开始,依次将每个元素与目标值进行比较,直到找到目标值或遍历完整个表。
折半查找法
折半查找法适用于有序表。它将查找区间一分为二,判断目标值在左半区间还是右半区间,然后在对应的区间继续查找,直到找到目标值或区间缩小为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))
七、总结
查找算法是数据结构中的重要部分,很重要哦!还有排序!不同的查找算法适用于不同的场景。通过本文的介绍,希望能帮助读者理解和掌握常见的查找算法,并能根据实际需求选择合适的查找方法。