关于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;
}
}

 

 

 

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

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值