2104 K-th Number (划分树+划分表)

本文介绍一种利用划分树和划分表求解区间内第K大数的方法。通过建立划分树并配合折半查找思想,高效定位目标值。文章包含详细算法流程及AC代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

花了一整天做这题,总结一下.

http://poj.org/problem?id=2104

求 区间 [ b,e ] 的第K大数

思路 

   建立划分树和划分表

   对划分表折半查找, 同时不断缩小要求查找的区间 [ b, e ], 直至b=e时结束.

概念 :

划分树 对一个无序序列,通过建立划分树对其排序。用二维数组segTree[18][100001]表示划分树对象,数组第一维表示树高,第二维表示每层的节点。

划分表 用来记录划分树中某节点被划分到左子树还是右子树。节点i记录i之前节点中{包 括i}被划分到左子树的数目。用toLeft[18][100001]表示划分表,两维分别与划分树的每层,每个节点相对应。

建树 :

        对于树中每一个节点,如果它小于等于该树的中位数,该节点进左子树;否则,该节点进右子树。与此同时,在划分表中记录该节点被划分进了哪个子树。

语言描述:

procedure  Build

获得中位数;

For 对树中每一个节点

If  该节点值小于等于中位数

划分进左子树;

划分表记录该节点被划分到了左子树

Else

划分进右子树;

划分表记录该节点被划分到了右子树

Build 左子树;

Build 右子树;

查找第K大数:

      与折半查找很类似,直接给出描述。

Procedure  Search

假设某次划分到左子树n个节点

kn比较

If  k <= n

那么第k大数一定在该树的左子树中,问题转化成进入左子树,求左子树的第k大数

Else  k > n 

问题转化成进入右子树,求右子树的第k-n大数

 

以下是这题AC代码 

 


 

 

 

xthreg EG_Vt $c1, rx(lnGI) qx(pgdp) thnum(1) trim(0.01) grid(400) bs(300) Estimating the threshold parameters: 1st ...... Done Boostrap for single threshold .................................................. + 50 .................................................. + 100 .................................................. + 150 .................................................. + 200 .................................................. + 250 .................................................. + 300 Threshold estimator (level = 95): ----------------------------------------------------- model | Threshold Lower Upper -----------+----------------------------------------- Th-1 | 10.0971 10.0795 10.1016 ----------------------------------------------------- Threshold effect test (bootstrap = 300): ------------------------------------------------------------------------------- Threshold | RSS MSE Fstat Prob Crit10 Crit5 Crit1 -----------+------------------------------------------------------------------- Single | 94.4496 0.0333 33.16 0.0100 18.7528 26.6936 33.0805 ------------------------------------------------------------------------------- Fixed-effects (within) regression Number of obs = 2849 Group variable: code Number of groups = 259 R-sq: Within = 0.2411 Obs per group: min = 11 Between = 0.0177 avg = 11.0 Overall = 0.0517 max = 11 F(7,2583) = 117.26 corr(u_i, Xb) = -0.6343 Prob > F = 0.0000 ------------------------------------------------------------------------------ EG_Vt | Coefficient Std. err. t P>|t| [95% conf. interval] -------------+---------------------------------------------------------------- density | -.0928785 .022725 -4.09 0.000 -.1374396 -.0483175 stru | .789217 .0951683 8.29 0.000 .6026032 .9758308 tech | 2.355489 .3959679 5.95 0.000 1.579042 3.131936 fin | .0333975 .0085045 3.93 0.000 .0167213 .0500738 fdi | 1.258643 .3487616 3.61 0.000 .5747629 1.942524 | _cat#c.lnGI | 0 | .1344615 .0208013 6.46 0.000 .0936726 .1752504 1 | .1261035 .0202928 6.21 0.000 .0863117 .1658953 | _cons | -.6115522 .2407475 -2.54 0.011 -1.08363 -.1394747 -------------+---------------------------------------------------------------- sigma_u | .29069801 sigma_e | .19120781 rho | .69801182 (fraction of variance due to u_i) ------------------------------------------------------------------------------ F test that all u_i=0: F(258, 2583) = 13.31 Prob > F = 0.0000
最新发布
07-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值