查找:静态查找和动态查找。

衡量查找算法的最主要的标准是平均查找长度(Average Search Length,简 称 ASL)。平均查找长度是指在查找过程中进行的关键码比较次数的平均值。

顺序查找(Sequnce Search)又称线性查找(Linear Search),其基本思想是:从 静态查找表的一端开始,将给定记录的关键码与表中各记录的关键码逐一比较, 若表中存在要查找的记录,则查找成功,并给出该记录在表中的位置;否则,查找失败,给出失败信息。

    public int SeqSearch(SeqList<int> sqList, int data)
{
sqList[] = data;
int i = ;
for (i = sqList.GetLength(); sqList[i] > data; --i);
{
return i;
}
}

SeqSearch(SeqList sqList, int data)

折半查找(Binary Search)又叫二分查找,其基本思想是:在有序表中,取中 间的记录作为比较对象,如果要查找记录的关键码等于中间记录的关键码,则查 找成功;若要查找记录的关键码小于中间记录的关键码,则在中间记录的左半区 继续查找;若要查找记录的关键码大于中间记录的关键码,则在中间记录的右半 区继续查找。不断重复上述查找过程,直到查找成功,或有序表中没有所要查找 的记录,查找失败。

    public int BinarySearch(SeqList<int> sqList, int key)
{
sqList[] = key; //0单元存放要查找的记录
int mid = ;
int flag = -;
int low = ; //设置初始区间的下限值
int high = sqList.GetLength(); //设置初始区间的上限值
//记录没有查找完
while (low <= high)
{
//取中点
mid = (low + high)/;
//查找成功,记录位置存放到flag中
if (sqList[] == sqList[mid])
{
flag = mid;
break;
}
//调整到左半区
else if(sqList[] < sqList[mid])
{
high = mid -;
}
//调整到右半区
else
{
low = mid + ;
}
}
if (flag > )
{
Console.WriteLine("Search is successful!");
return flag;
}
else
{
Console.WriteLine("Search is failing!");
return -;
}
}

BinarySearch(SeqList sqList, int key)

索引查找(Index Search)又称分块查找。比如,对于下图现在要查找关键码为 54 的记录。先将 54 依次与索 引表中每个记录的 data 域的值进行比较,由于 34<54<66,则若在主表中存在关 键码为 54 的记录,则该记录必定在主表的第 3 个子表中。由于相应的 link 域的 值为 10,所以,从主表的第 11 个记录(数组的下标为 10)开始进行顺序查找。 当比较到主表的第 13 个记录(数组的下标为 12)时,关键码相等,说明主表中 有要查找的记录,则查找成功。当然,如果比较到第 15 个记录(因为索引表的 下一个记录的 link 域的值为 14)仍然不等,说明主表中不存在要查找的记录, 查找失败。

二叉排序树查找过程为:

(1)若二叉排序树为空,则查找失败(下面的算法实现以返回 1 表示查找 失败);

(2)若二叉排序树非空,则将给定记录的关键码与二叉排序树根结点的关 键码进行比较,如果相等,则查找成功(下面的算法实现以返回 0 代表查找成功), 查找过程结束。否则,执行以下两步中的一步;

(3)若给定记录的关键码小于二叉排序树根结点的关键码,查找将在根结 点的左子树上继续进行,转(1);

(4)若给定记录的关键码大于二叉排序树根结点的关键码,查找将在根结 点的右子树上继续进行,转(1)。

二叉排序树上的查找算法的实现如下:

    public int Search(BiTree<int> bt, int key)
{
Node<int> p; //二叉排序树为空
if (bt.IsEmpty() == true)
{
Console.WriteLine("The Binary Sorting Tree is empty!");
return ;
}
p = bt.Head;
//二叉排序树非空
while (p != null)
{
//存在要查找的记录
if (p.Data == key)
{
Console.WriteLine("Search is Successful!");
return ;
}
//待查找记录的关键码大于结点的关键码
else if (p.Data < key)
{
p = p.LChild;
}
//待查找记录的关键码小于结点的关键码
else
{
p = p.RChild;
}
}
return ;
}

Search(BiTree bt, int key)

哈希法主要考虑两个问题,其一是如何构造哈希函数,其二是如何解 决哈希冲突

常用的哈希函数构造方法:直接定址法;除留余数法;数字分析法;平方取中法;

解决哈希冲突:

开放地址法:是指当由关键码得到的哈希地址一旦产生冲突,即该地址中已经存放了记录,就去寻找下一个哈希地址,直到找到空的哈希地址为止。

二次探测法:线性探测法由于是一个地址单元一个地址单元探测,探测的增量是线性的,所以容易产生堆积问题。

链表法:用链表法解决哈希冲突有两种方法:

第一种方法是把所有的同义词用单链表链接起来;

第二种方法是当哈希表中相应位置为空时直接存放,当哈希表中相应 位置非空时用单链表链接起来。

C#数据结构_查找的更多相关文章

  1. Go 数据结构--二分查找树

    Go 数据结构--二分查找树 今天开始一个Go实现常见数据结构的系列吧.有时间会更新其他数据结构. 一些概念 二叉树:二叉树是每个节点最多有两个子树的树结构. 完全二叉树:若设二叉树的高度为h,除第 ...

  2. 【Java】 大话数据结构(11) 查找算法(2)(二叉排序树/二叉搜索树)

    本文根据<大话数据结构>一书,实现了Java版的二叉排序树/二叉搜索树. 二叉排序树介绍 在上篇博客中,顺序表的插入和删除效率还可以,但查找效率很低:而有序线性表中,可以使用折半.插值.斐 ...

  3. cb34a_c++_STL_算法_查找算法_(7)_lower_bound

    cb34a_c++_STL_算法_查找算法_(7)_lower_bound//针对已序区间的查找算法,如set,multiset关联容器-自动排序lower_bound()--第一个可能的位置uppe ...

  4. cb33a_c++_STL_算法_查找算法_(6)binary_search_includes

    cb33a_c++_STL_算法_查找算法_(6)binary_search_includes//针对已序区间的查找算法,如set,multiset关联容器-自动排序binary_search(b,e ...

  5. cb32a_c++_STL_算法_查找算法_(5)adjacent_find

    cb32a_c++_STL_算法_查找算法_(5)adjacent_findadjacent_find(b,e),b,begin(),e,end()adjacent_find(b,e,p),p-par ...

  6. cb31a_c++_STL_算法_查找算法_(4)find_first_of

    cb31a_c++_STL_算法_查找算法_(4)find_first_offind_first_of(b,e,sb,se),sb,second begin, se,second end();find ...

  7. cb30a_c++_STL_算法_查找算法_(3)search_find_end

    cb30a_c++_STL_算法_查找算法_(3)search_find_endsearch()pos = search(ideq.begin(), ideq.end(), ilist.begin() ...

  8. cb29a_c++_STL_算法_查找算法_(2)search_n

    cb29a_c++_STL_算法_查找算法_(2)search_n//比如:连续查找连续的n个8search_n(b,e,c,v),迭代器b,begin(),e,end().连续的c个vpos=sea ...

  9. cb28a_c++_STL_算法_查找算法_(1)find_find_if

    cb28a_c++_STL_算法_查找算法_(1)find_find_iffind() //线性查找,比较慢.pos1 = find(ilist.begin(), ilist.end(), 5);fi ...

随机推荐

  1. 读完这篇文章,5G 就没有秘密了

    如果我们现在要制作一个 2019 年的热词排行榜,相信 5G 一定名列榜单前茅.作为第五代移动通信网络,5G 技术一直备受瞩目.随着 5G 商用牌照在国内的发放,各大手机厂商也是紧接着推出各款 5G ...

  2. 7月新的开始 - LayUI的基本使用 - 分页

    LayUI 分页处理 数据展示是以表格的形式展示的.使用模块如下: 首先使用内置模块-数据表格 然后使用内置模块-分页 官方文档地址:https://www.layui.com/doc/ 官方示例地址 ...

  3. HTML--CSS样式表--格式与布局

    一:position:fixed 锁定位置(相对于浏览器的位置),例如有些网站的右下角弹窗 例如: <head> <title>网页标题</title> <s ...

  4. Git 从master拉取代码创建新分支

    从master拉取新分支并push到远端 开发过程中经常用到从master分支copy一个开发分支: 1.切换到被copy的分支(master),并且从远端拉取最新版本 $git checkout m ...

  5. Mac 10.14.4 编译openjdk1.9源码 及集成clion动态调试

    警告⚠️:本文耗时很长,先做好心理准备:编译openjdk源码需要很大的耐心,因为要踩很多坑,解决很多问题,本人从编译开始到结束用了两天时间,按照本篇教程踩坑会少许:谢谢观看 一.获取openjdk源 ...

  6. 从原理层面掌握@SessionAttribute的使用【一起学Spring MVC】

    每篇一句 不是你当上了火影大家就认可你,而是大家都认可你才能当上火影 前言 该注解顾名思义,作用是将Model中的属性同步到session会话当中,方便在下一次请求中使用(比如重定向场景~). 虽然说 ...

  7. python中的赋值操作与C语言中的赋值操作中的巨大差别

    首先让我们来看一个简单的C程序: a = ; b = a; b = ; printf("a = %d, b = %d\n", a, b); 相信只要学过C语言, 不用运行程序便能知 ...

  8. git开发流程

    典型的工作流程和做法是,由于你没有远程仓库的权限,你先在github通过fork,复制自己的一份远程仓库,然后通过clone你自己这个远程副本到本地,进行修改,修改后push到自己的githu远程副本 ...

  9. Redis批量删除key的小技巧,你知道吗?

    在使用redis的过程中,经常会遇到要批量删除某种规则的key,但是redis提供了批量查询一类key的命令keys或scan,没有提供批量删除某种规则key的命令,怎么办?看完本文即可,哈哈. 本文 ...

  10. .Net异步编程详解入门

    前言 今天周五,早上起床晚了.赶着挤公交上班.但是目前眼前有这么几件事情.刷牙洗脸.泡牛奶.煎蛋.在同步编程眼中.先刷牙洗脸,然后烧水泡牛奶.再煎蛋,最后喝牛奶吃蛋.毫无疑问,在时间紧促的当下.它完了 ...