关于C++查找(顺序查找、二分查找、二叉树查找、Hash查找)的一些心得

本人C++学习已有一段时间

这里总结下关于简单查找的对比以及相应的实现方式

 

(1)顺序查找

适用于数据本身没有特征(无顺序)时间复杂度为O(n).

 

int linearsearch(int list[], int key, int arraysize)
{
for (int i = 0; i < arraysize; i++)
{
if (key == list[i])
return i;
}
return -1;
}

(2)二分查找

适用于有序数组,这里假设数组为递增序列,其时间最大复杂度为log(n+1)/log(2)

 

int binarysearch(int list[], int key, int arraysize)
{
int low = 0;
int high = arraysize - 1;
while (low <= high)
{
int mid = (low + high)/2;
if (list[mid] < key)
low = mid + 1;
if (list[mid] == key)
return mid;
else
high = mid - 1;
}
return -low - 1;
}

(3)二叉树查找

这里首先明确排序二叉树的定义:

1.非叶子节点至少一边的分支非NULL

2.叶子节点左右分支都为NULL

3.每一个节点记录一个数据,同时左分支的数据都小于右分支的数据

 

typedef struct NODE
{
int data;
NODE *left;
NODE *right;
};

NODE *binarytreesearch(NODE*pnode, int value)
{
if (pnode == NULL)
return NULL;
if (value == pnode->data)
return pnode;
else if (value < pnode->data)
return binarytreesearch(pnode->left, value);
else
return binarytreesearch(pnode->right, value);
}

 

 

(4)Hash查找

之前的查找方式(2)、(3)都是基于在有序的基础上,没有规律且数据量较大时,通过牺牲一些内存来实现快速查找。

哈希表定义如下:

1.每个数据按照某种聚类运算归到某一大类,然后所有数据链成一个链表

2.所有链表的头指针形成一个指针数组

哈希其实就是在记录的存储位置和记录的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。

常用的哈希函数有

1.线性法

2.除留余数法

哈希函数的运用可能会造成哈希冲突,可以使用线性探测解决

 

这里简单举例Hash查找

 

typedef struct NODE
{
int data;
NODE *next;
};

NODE *hashsearch(NODE *arr[], int mod, int value)
{
int index = value%mod;
if (arr[index] == NULL)
return NULL;
NODE *pnode = arr[index];
while (pnode)
{
if (value == pnode->data)
return pnode;
pnode = pnode->next;
}
}

 

 

 

如有错误,请指正,虚心请教

 

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/qq_27767337/article/details/80340940
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞