求一个高效的算法,大家各抒己见

项目里的分类设计:
12230000,一共八位,每两位表示一个分类层级。
例如:
12000000表示“家装建材”
12230000表示“家装建材”->“瓷砖地板”
12230100表示“家装建材”->“瓷砖地板”->“防水地板”
设计的优点:
对于获取某个分类(瓷砖地板)下面的子分类直接:select * from table where id > 12230000 and id <= 12239900,然后从这个结果里面踢掉最后两位非0的记录。

这样设计随即的麻烦来了,我们怎么求出:12239900?对于计算一个二级分类下的子类这个最大值是12239900,但对于计算一级分类下的子类这个最大值就变成:12990000,同样计算三级分类子类这个最大值为:12239999。

怎么可以很优雅地计算这个最大值?现在的做法很笨:字符串截取,连接然后再str_pad。

评论 (3)链接2012-02-29 
  • 0 支持
    你这个要算的最大值是某个分类下的子类的最大值吧? – 张玉海 2012-02-29
  • 0 支持
    一串数字,想不通为啥要用Str的方式,数字求余,求商都行的。 – Mosence 2012-06-21
  • 0 支持
    其实挺好的啊……这方法……没啥不高效的。和你后面跟着的那个Select的消耗一比,你在乎前面是用字符串还是用数值运算就傻得可爱了。 – 灵剑2012 2012-09-18

通过@zhupp 提供的思路更改如下:

  
$num = 12011000;    
$level = 0;
while(($num % 100) === 0) {
$level++;
$num /= 100;
}
echo $level;
//an=a1+(n-1)*d
//a1 = 2;
//a2 = 2 + (2-1)*2 = 4;
//a3 = 2 + (3-2)*2 = 6;
//max = num + pow(10, an)
//$sql = select * from table where id > num and id < max
soooldier
编辑于 2012-03-11
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-29