mirror of
https://gitee.com/Lamdonn/varch.git
synced 2025-12-06 08:46:42 +08:00
4.2 KiB
4.2 KiB
介绍
查找算法是用于在数据结构中查找特定元素的算法。常见的查找算法包括线性查找、二分查找、哈希查找等。下面简要介绍这些查找算法的原理和实现:
线性查找:线性查找是一种最简单的查找算法,它从数据结构的起始位置开始,逐个比较每个元素,直到找到目标元素或遍历完所有元素。线性查找的时间复杂度为O(n),其中n为数据结构的大小。
二分查找:二分查找适用于有序的数据结构,它每次将数据结构分为两半,然后根据目标元素与中间元素的比较结果来确定继续查找的子区间。二分查找的时间复杂度为O(log n)。
哈希查找:哈希查找通过构造哈希函数将数据映射到哈希表中,然后根据哈希值直接访问目标元素。哈希查找的平均时间复杂度为O(1)。*** 在dict模块中就应用hash查找 ***
接口
int search_linear(void *array, int left, int right, void *target, SearchOPS *ops);
int search_binary(void *array, int left, int right, void *target, SearchOPS *ops);
这两种查找算法使用方法一致,都是传入数据地址、数组查找区间、查找目标和依赖于数据容器的操作集,返回查找出来的数组索引(失败将会返回负数)。
测试
static void test_linear(void)
{
int array[] = {6, 3, 1, 0, -2, 9};
SearchOPS ops;
int target = 1;
ops.addr = int_array_addr;
ops.cmp = int_cmp;
target = 9, printf("search %d, result %d\r\n", target, search_linear(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = -2, printf("search %d, result %d\r\n", target, search_linear(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = 0, printf("search %d, result %d\r\n", target, search_linear(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = 1, printf("search %d, result %d\r\n", target, search_linear(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = 3, printf("search %d, result %d\r\n", target, search_linear(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = 6, printf("search %d, result %d\r\n", target, search_linear(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = 5, printf("search %d, result %d\r\n", target, search_linear(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = -9, printf("search %d, result %d\r\n", target, search_linear(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
}
结果
search 9, result 5
search -2, result 4
search 0, result 3
search 1, result 2
search 3, result 1
search 6, result 0
search 5, result -1
search -9, result -1
static void test_binary(void)
{
int array[] = {0, 3, 6, 10, 62, 99};
SearchOPS ops;
int target = 10;
ops.addr = int_array_addr;
ops.cmp = int_cmp;
target = 0, printf("search %d, result %d\r\n", target, search_binary(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = 3, printf("search %d, result %d\r\n", target, search_binary(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = 6, printf("search %d, result %d\r\n", target, search_binary(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = 10, printf("search %d, result %d\r\n", target, search_binary(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = 62, printf("search %d, result %d\r\n", target, search_binary(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = 99, printf("search %d, result %d\r\n", target, search_binary(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = 5, printf("search %d, result %d\r\n", target, search_binary(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
target = -9, printf("search %d, result %d\r\n", target, search_binary(array, 0, sizeof(array) / sizeof(array[0]) - 1, &target, &ops));
}
结果
search 0, result 0
search 3, result 1
search 6, result 2
search 10, result 3
search 62, result 4
search 99, result 5
search 5, result -1
search -9, result -1