Re: [问题] 关于作业5还有一些问题

楼主: tempTTP1 (任剑翔)   2011-12-11 01:03:50
助教:
谢谢助教的解释,这边说一下我的想法。就上课听到的说法是leaf page
满的时候会split,会先把所有的record依照key排序并取最中间那个往上传,
不过那个record还会有份copy留在leaf page里面,接下来page再以往上传的key
为分界,分一半的record到新的page里面;index page的split也是相似,只不过
出中间的key之后会直接push up,不会有一份copy留着。
另外我是想说如果page已经满了,要加的那一个pair如果不会被加进去,就只好
把原本page的所有pairs都读出来手动用keyCompare排序,这样才能找最中间那个
,不过现在想想好像是因为取最中间那个,所以由大到小或相反其实都没有差了。
然后我看过sorted_page.C会觉得是由大到小是因为他是keyCompare(key1,key2,..)
<0才会做交换的动作,而keyCompare()的做法是return key1-key2,所以看起来应
该是想把大的key放到前面,不过我现在才想到且发现,slot顺序是从0,-1,-2...来
存的,所以应该是由小到大排才对...,不好意思 囧。
谢谢助教
※ 引述《TimeString (时弦 - 我要DJmax的pc版!)》之铭言:
: 标题: Re: [问题] 关于作业5还有一些问题
: 时间: Sun Dec 11 00:13:10 2011
:
: Hi 同学,
:
:
: 你所提到当一个 page 里 insert 太多个 records,
:
: 会造成 page 需 split 的状况,而需把中间的 key 往上传,
:
: 这个观念是正确的。
:
:
: 但是我想在这边丢个问题,
:
: BTLeafPage 和 BTIndexPage 的 page split 的状况有没有一样?
:
:
: 另外,如果从 implement 的角度,
:
: 要把 BTreeFile.C 里的 insert method 给 implement 出来,
:
: 其实当你知道 BTIndexPage 有 insertKey(),
:
: BTLeafPage 有 insertRecord() 这两个 API,
:
: 应该就有足够的资讯了,就算是不知道 sorted page 里面怎么实作。
:
:
: 然而,因为 btree_driver.C 会用 BTreeFile 里的 new_scan() 来作测试,
:
: 这个函式传了 low_key 与 high_key,
:
: 会把整个 btree 介于 low_key 与 high_key 间的 dataRid 都找出来,
:
: 所以仍需要知道 sorted page 里 records 是由小到大排或相反。
:
: 能不能请你分享一下你的想法,为什么会觉得是由大到小排?
:
:
: 另外建议一下同学,可以先把自己想法 po 出来,再提出你的疑点!
:
:
:
: ※ 引述《tempTTP1 (任剑翔)》之铭言:
: : 助教,各位同学:
: : 不好意思,问题有点多,目前还有一些问题还请各位能帮忙解答一下,
: : 如果一个page能装n个[key, pageNo]或[key, rid]的pair,现在有个page已经满了,
: : 要再加一个pair,那当我看到insertKey或insertRec return!=OK的时候,就要把这
: : n+1个key和pageNo(或rid)都先sort再取最中间那个往上传吧?那请问sort的时候是由
: : 小排到大还是由大到小呢?我看sorted_page.C的insert里面是大到小的样子,但是他
: : 写得好像有点简单,所以想确认一下。还是说insertRec或insertKey return!=OK的
: : 时候其实是有写入,只是要告诉我们他已经满了?
: : 谢谢助教,各位同学
:
:
作者: TimeString (时弦 - 我要DJmax的pc版!)   2011-12-11 01:06:00
嗯! 你全部都讲对了!
楼主: tempTTP1 (任剑翔)   2011-12-11 01:07:00
谢谢助教~ :)

Links booklink

Contact Us: admin [ a t ] ucptt.com