以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 计算机考研交流 』   (http://bbs.xml.org.cn/list.asp?boardid=67)
----  [求助][DS]关于真题中的几个题目  (http://bbs.xml.org.cn/dispbbs.asp?boardid=67&rootid=&id=37575)


--  作者:Smilingface
--  发布时间:9/4/2006 4:42:00 PM

--  [求助][DS]关于真题中的几个题目
1.  02年的一.3题中找中间值的操作,我本来觉得是应该先进行排序处理的,但是据说存在不经排序就可实现的O(n)算法,哪位高手给个思路我啊.
2.  04年一.6题的B+树是不是有问题啊?它应该是用的最小复写原则,可是1层不是完全符合的啊,而且0层中的M,S在叶结点里都没有出现.
3.  书上P60的众多串操作中,形参都是写的是( char *s1,*s2),可是按照严格的语法不是必须写成( char *s1,char *s2)的吗?

Thank very much!!


--  作者:Supremgoooo
--  发布时间:9/9/2006 10:22:00 PM

--  
1。“据说存在不经排序就可实现的O(n)算法”
有吗?哪里说的?呵呵,我是认为不排序没法做。

2。“它应该是用的最小复写原则”
不知道啥是最小复写原则。这道题是一颗变形的B+树——内外节点不等阶的B+树。因为B+树只在叶上存放信息,所以可以是分内外两种节点类型存储(该法显然省空间)。对B+树,要认识到,它的所有节点都是叶节点内容的副本,因为B+树是“从下向上”构造的(这点与B-树不一样),“上去的”信息是用来给查找划界限用的,常见的界限划分方法有:
(i)——A——B——C,分别是小于等于A,小于等于B,小于等于C,这显然对应一颗正常的B+树,因为它的儿子数等于关键吗数。
(ii)——A——B——,分别是小于等于A,大于A小于等于B,大于B,这是B-树的思路,因为它的儿子数比关键码数大1。
本题采用的是第二种思路,所以它的内部节点本质上相当与一颗B-树的结构,而最外层叶子相当于B+树的结构。
搞清楚它的结构后这个题就简单了:题目说内部的阶为4,按照B-树的计算方法,关键码数范围是:1-3,儿子数范围是2-4;外部节点的阶为3,按照B+树的计算方法,关键码数的范围是2-3,然后按照B+树的删除算法就可以了。
另外:说下替换原则(本题不需要),书上说的并不太清楚,我认为一种比较好的办法是:右边第一个儿子下最左叶子中的最左关键码。

3。不知道教材为啥这样写。我认为教材写的不对。


--  作者:Smilingface
--  发布时间:9/11/2006 8:11:00 PM

--  
以下是引用Supremgoooo在2006-9-9 22:22:00的发言:
1。“据说存在不经排序就可实现的O(n)算法”
有吗?哪里说的?呵呵,我是认为不排序没法做。

2。“它应该是用的最小复写原则”
不知道啥是最小复写原则。这道题是一颗变形的B+树——内外节点不等阶的B+树。因为B+树只在叶上存放信息,所以可以是分内外两种节点类型存储(该法显然省空间)。对B+树,要认识到,它的所有节点都是叶节点内容的副本,因为B+树是“从下向上”构造的(这点与B-树不一样),“上去的”信息是用来给查找划界限用的,常见的界限划分方法有:
(i)——A——B——C,分别是小于等于A,小于等于B,小于等于C,这显然对应一颗正常的B+树,因为它的儿子数等于关键吗数。
(ii)——A——B——,分别是小于等于A,大于A小于等于B,大于B,这是B-树的思路,因为它的儿子数比关键码数大1。
本题采用的是第二种思路,所以它的内部节点本质上相当与一颗B-树的结构,而最外层叶子相当于B+树的结构。
搞清楚它的结构后这个题就简单了:题目说内部的阶为4,按照B-树的计算方法,关键码数范围是:1-3,儿子数范围是2-4;外部节点的阶为3,按照B+树的计算方法,关键码数的范围是2-3,然后按照B+树的删除算法就可以了。
另外:说下替换原则(本题不需要),书上说的并不太清楚,我认为一种比较好的办法是:右边第一个儿子下最左叶子中的最左关键码。

3。不知道教材为啥这样写。我认为教材写的不对。


1。学习指导上的解答里说的(P483)。
2。“最小复写原则”就是那个”最小关键码复写原则“啊,”所有的关键码均出现在叶结点上,上面各层结点中的关键码均是下一层相应结点中最小关键码的复写“(教材P349)。你不是也说”它的所有节点都是叶节点内容的副本“吗?可是我觉得你下面对B+树的描述和教材里说的不一样啊。按照教材对B+树的定义,
”所有的关键码均出现在叶结点上,上面各层结点中的关键码均是下一层相应结点中最小关键码的复写“,
可是题目中的M在叶结点中根本就没有啊。
PS:又发现了几处问题。
3。01年的一。6题b的答案应该不是唯一的吧(学习指导里只给了一种)?题目中告诉顶点在内存中以字母顺序存放有什么用吗?
4。P375里对struct GLNode的定义你看明白了吗?typedef怎么用在这里呢,它给GLNode起的别名是啥啊?枚举类型TAG定义变量的时候必须带上enum才对吧?还有GLNode里面定义了一个无名union类型,可是它又没有定义变量啊?
这个GLNode的定义把我都弄糊涂了。。。。。。。。。。。。。


--  作者:Supremgoooo
--  发布时间:9/11/2006 11:07:00 PM

--  
1。想不出来。。

2。“可是题目中的M在叶结点中根本就没有啊”
这很正常。这颗B+数可能原来叶中有关键码M,且在建树的时候正好把它作为线索升上去了,但是之后又经过了M的删除操作,B+树的删除只在叶上进行,上面的M可以不删除用来做分界。
另外,关于“最小复写原则”,我看了一下,它是围绕着B+树的特点定义的,你可以认为B+树是自下向上构造的,我在上面写的:
(i)——A——B——C,分别是小于等于A,小于等于B,小于等于C,这显然对应一颗正常的B+树,因为它的儿子数等于关键吗数。
就是所谓的“最大复写原则”,如果是这样:A——B——C——就是最小复写了,我认为不必拘泥与这些概念。B+树是灵活的,像这道题用到的:——A——B——就是例外。

imho:B+树,B-树的解题关键是确定它节点中的关键码数和儿子数的范围,讨论“复写”是没啥意义的。

3。01年的一。6题b的答案应该不是唯一的吧(学习指导里只给了一种)?题目中告诉顶点在内存中以字母顺序存放有什么用吗?
唯一,因为顶点在内存中以字母顺序存放。你画一下它的临界表,答案一下就出来了。

4。等我后天仔细看一下:)


--  作者:Supremgoooo
--  发布时间:9/18/2006 10:21:00 PM

--  
4。P375里对struct GLNode的定义你看明白了吗?typedef怎么用在这里呢,它给GLNode起的别名是啥啊?枚举类型TAG定义变量的时候必须带上enum才对吧?还有GLNode里面定义了一个无名union类型,可是它又没有定义变量啊?
这个GLNode的定义把我都弄糊涂了。。。。。。。。。。。。。

(1)你可以直当没有看见typedef,不影响此处理解。

(2)TAG在本书中已经统一定义,这里直接用不影响理解。

(3)这个union意思是说此处二者取一,要么取data,要么取sublist。
注意:这本书的特点是线性表都有头结点的,掌握了这个算法就不难理解了。


--  作者:Smilingface
--  发布时间:9/19/2006 12:09:00 PM

--  
Thank you very much!!!
B+树的我懂了,以前学数据结构的时候,没怎么学B+树,张铭那本书上又仅说了那一种情况,再遇到那个题目就不太懂了。
可是你说的这个
“唯一,因为顶点在内存中以字母顺序存放。你画一下它的临界表,答案一下就出来了。”
是什么意思啊?临界表是什么东东?我好象完全没有这个概念。。。。。。。
发现了自己的一个知识漏洞,呵呵。
--  作者:Smilingface
--  发布时间:9/19/2006 12:54:00 PM

--  
PS:核对一个题目的答案。
03年五。1题,答案说若使用头指针出队(or入队)的时间开销是O(1),记不太清了,反正是说其中一个操作是O(n),另一个是O(1)。个人觉得两个操作都是O(n)吧?因为都需要从头指针去找尾指针。
--  作者:carroty
--  发布时间:9/19/2006 3:06:00 PM

--  
1.取中间值确实有O(n),我看的一本,mark allen weiss的书上有这样的讨论.

思路就是用快速排序的变体,然后,可以一次缩小约1/2的范围,平均情况有O(n);


--  作者:carroty
--  发布时间:9/19/2006 3:20:00 PM

--  
b+一直没怎么看懂,回头再看看~
--  作者:Supremgoooo
--  发布时间:9/19/2006 10:55:00 PM

--  
临界表是什么东东?我好象完全没有这个概念。。。。。。。
O my god!,首先这里写错了,是“邻接表”;其次,这个东西ds图的第一节课必讲,是图在计算机中的基本存储形式,随便找本ds书图的第一节都有介绍的。

03年五。1题,答案说若使用头指针出队(or入队)的时间开销是O(1),记不太清了,反正是说其中一个操作是O(n),另一个是O(1)。个人觉得两个操作都是O(n)吧?因为都需要从头指针去找尾指针。
这是队列!队列是两头操作的,咋可能两个n?
例如:
temp=head;
head=head->link;
这是O(1)的算法。

1.取中间值确实有O(n),我看的一本,mark allen weiss的书上有这样的讨论.

思路就是用快速排序的变体,然后,可以一次缩小约1/2的范围,平均情况有O(n);
等我有空想下:)

b+一直没怎么看懂,回头再看看~
我认为B-树能看懂,B+树就没问题了,因为更简单一些。


--  作者:Smilingface
--  发布时间:9/26/2006 7:29:00 PM

--  
临界表是什么东东?我好象完全没有这个概念。。。。。。。
O my god!,首先这里写错了,是“邻接表”;其次,这个东西ds图的第一节课必讲,是图在计算机中的基本存储形式,随便找本ds书图的第一节都有介绍的。

sign.......................原来是邻接表啊....................我说怎么听都没听说过呢.
弄明白那道题是怎么回事了,谢谢.

03年五。1题,答案说若使用头指针出队(or入队)的时间开销是O(1),记不太清了,反正是说其中一个操作是O(n),另一个是O(1)。个人觉得两个操作都是O(n)吧?因为都需要从头指针去找尾指针。
  这是队列!队列是两头操作的,咋可能两个n?
例如:
temp=head;
head=head->link;
这是O(1)的算法。

如果不是循环链表当然是对的,但是这里用的是循环链表,所以你上面写的这个出队操作还没有完成,还需要把rear->link=head,而从从头指针找尾指针需要O(n)的时间开销.


--  作者:Smilingface
--  发布时间:9/26/2006 7:37:00 PM

--  
(3)这个union意思是说此处二者取一,要么取data,要么取sublist。
union的用法我当然是知道的,但是在这个地方我觉得应该加一个变量的定义,就是说写成
union{
        ElemType data;
        GLNode* sublist;
        }mid;
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
109.375ms