以文本方式查看主题

-  计算机科学论坛  (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=48302)


--  作者:蝶影
--  发布时间:6/10/2007 6:37:00 AM

--  请教DS课本上的两个问题
DS课本P286 败者树初始化代码

1)中间有三行个代码
//计算s=2^log(n-1)
int i,s;
for(s=1;2*s<=n-1;s+=s);

应该是s=2^(logn-1)吧?s应该代表次底层的结点个数吧?(n为选手数)

2)if(n%2)
{//n为奇数,内部结点和外部结点比赛
//这里用L[LowExt+1]和它的父节点比赛
//因为此时它的父结点中存放的是其兄弟结点处的比赛胜者索引
Play(n/2,B[(n-1)/2],LowExt+1,winner,loser);
i=LowExt+3;
}
请问怎么推出内部结点是B[(n-1)/2],父结点的下标是n/2?


--  作者:virlinG
--  发布时间:6/10/2007 12:50:00 PM

--  
s=2^log(n-1),s代表次底层第一个内部节点的编号,可由公式for(s=1;2*s<=n-1;s+=s)推出。

  内部结点B[(n-1)/2]的父结点的下标与n/2无关,这里不是求B[(n-1)/2]的父结点的下标,B[(n-1)/2]
  中存放了子节点的比赛胜者索引(字节点是最底层),而次底层中L[LowExt+1]的兄弟节点存放了相对
  与B[(n-1)/2]的比赛败者索引,因此Play(n/2,B[(n-1)/2],LowExt+1,winner,loser)中n/2为LowExt+1
  和n-1的父节点索引,即内部节点B[(n-1)/2]。


--  作者:蝶影
--  发布时间:6/10/2007 7:33:00 PM

--  
还有两个问题:
1.s=2^log(n-1),这个公式的log是以2为底的吧?那s=2^log(n-1)不就等于n-1了?
2.也就是LowExt+1和它的父节点比赛,然后败者还存回LowExt+1的父节点里?那为什么不写成(n-1)/2,还非得写成n/2...
--  作者:virlinG
--  发布时间:6/10/2007 11:31:00 PM

--  
我大概说一下,可能不太准确,一直在看离散,DS还没开始
    1. s=2^log(n-1)在这里她默认先计算log(n-1)并取下整, 可能P282讲过,在这里的注释中省略了
   2.  Play(n/2,B[(n-1)/2],LowExt+1,winner,loser)中(n-1)/2和n/2结果是相同的,但逻辑上有区别,(n-1)/2:L[LowExt+1]兄弟节点的子节点中胜者存入L[LowExt+1]兄弟节点的父节点,左路的归并其父节点自然用L[LowExt+1]兄弟节点表示:(n-1)/2
            n/2:LowExt+1和它的父节点比赛,这时逻辑上用LowExt+1来表示其父节点比较合理。     
写成n/2也可能是和Play((offset+i)/2,i-1,i,winner,loser)保持一致性(右子节点表示父节点)。。其实没必要,结果都一样

--  作者:蝶影
--  发布时间:6/11/2007 4:29:00 PM

--  
恩,这样说,明白很多,谢谢~
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms