讨论1:请回想一下曾经用过哪几种方法在自己的书架上放书。对于不同的方法,描述一下上述两个操作的步骤。然后想一想在容量巨大的图书馆里该如何存放图书,并且快速找到某一本指定的图书。整理出一封报告。
两个基本操作:
操作1:图书怎么插入?
操作2:怎么找到某本指定的书?
我的放书方法:
我书架上的图书,首先是按种类分,一种类别的书放一层,然后再把同种类别的图籍按从高到低的摆放在一层。我如果想在书架中插入一本书,我事先找到该书属于的层数,然后在这一层里找到中间的那本书,比较两本书的高矮,如果比中间的高,则再与前一半的图书的中间那本书比较,以此类推,找到摆放的位置。找到指定的书的方法就是按照书籍的名字找。
算法分析:该方法属于二分法。
百度查找:
1、二分查找(Binary Search)
二分查找又称折半查找它是一种效率较高的查找方法。
二分查找要求线性表是有序表即表中结点按关键字有序并且要用向量作为表的存储
结构。不妨设有序表是递增有序的。
2、二分查找的基本思想
二分查找的基本思想是设R[low..high]是当前的查找区间
1首先确定该区间的中点位置
2然后将待查的K值与R[mid].key比较若相等则查找成功并返回此位置否则须确定
新的查找区间继续二分查找具体方法如下
①若R[mid].key>K则由表的有序性可知R[mid..n].keys均大于K因此若表中存在关键
字等于K的结点则该结点必定是在位置mid左边的子表R[1..mid-1]中故新的查找区间是左
子表R[1..mid-1]。
②类似地若R[mid].key<K则要查找的K必在mid的右子表R[mid+1..n]中即新的查
找区间是右子表R[mid+1..n]。下一次查找是针对新的查找区间进行的。
因此从初始的查找区间R[1..n]开始每经过一次与当前查找区间的中点位置上的结点关
键字的比较就可确定查找是否成功不成功则当前的查找区间就缩小一半。这一过程重复直至
找到关键字为K的结点或者直至当前的查找区间为空(即查找失败)时为止。
3 二分查找算法
int BinSearch(SeqList RKeyType K)
{ //在有序表R[1..n]中进行二分查找成功时返回结点的位置失败时返回零
int low=1high=nmid //置当前查找区间上、下界的初值
while(low<=high){ //当前查找区间R[low..high]非空
mid=(low+high)/2
if(R[mid].key==K) return mid //查找成功返回
if(R[mid].kdy>K)
high=mid-1; //继续在R[low..mid-1]中查找
else
low=mid+1 //继续在R[mid+1..high]中查找
}
4 二分查找的优点和缺点
a.虽然二分查找的效率高但是要将表按关键字排序。而排序本身是一种很费时的运算。既使
b.采用高效率的排序方法也要花费O(nlgn)的时间。
c.二分查找只适用顺序存储结构。为保持表的有序性在顺序结构里插入和删除都必须移动大
量的结点。因此二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。
d.对那些查找少而又经常需要改动的线性表可采用链表作存储结构进行顺序查找。链表上无法实现二分查找。
分析我的操作的优缺点:
优点:较为逻辑性地摆放,效率高,对于自己书架上的图书摆放较为实用。
缺点:该方法摆放书籍容易,如果书的数量庞大,取出指定的书籍较难操作。
针对图书馆的书籍摆放在再结合我的图书摆放经验提出图书摆放及图书插入指定位子的改进方案:
1.图书摆放:
a.把这些书分类,分为文科类书籍和理科类书籍(分层)(文科类书籍为1,理科类书籍为0)
b.进一步地将这些大类中的书籍分成小类,并且每种类别编制一个类别名,按照字母根据书籍名字的第一个字的第一个字母为区分各本书的标准,如果两个字母相同,就根据第二个字母区别,以此类推表顺序将这些书籍进行排序并编号。(分教室)
c.再将小类里的书籍按照实用性不同进一步按照b中的方法进行分类(分书架)
d.最后。按照b重的方法将这些同个书架上的书籍进行排序并编号。
解释说明:
(*)(*......*)(*......*)(*......*)
第一个括号里代表文科类还是理科类;
第二个括号代表哪个教室里的书;
第三个括号里代表哪个书架;
最后一个括号代表哪本书;
书的插入就按图书的编码找到位子插入以及查询指定图书的位子。
优缺点分析:
优点:较为有条理地寻找书籍以及摆放书籍。
缺点:如果图书馆里新进一批书,就得将某一书架上的书重新排序,较为繁琐。