诚心请教"小于某个数的最大值"算法

zhangling92 2011-12-02 06:55:43
需求是这样的: 假设我从html的正文里面取50个字, 然后求高度, 然后判断这个高度是否是小于一个定值(比如800)的最大值! 如果是, 这个50就是我要的结果!

最简单最笨的方法是,从头到尾一个一个取, 然后遍历判断! 比如我先从html里面取1个字求高度, 比较是否大于800, 不大于就取2个字取高度再比较..(一次加1)...循环...直到取到第321个字后高度刚好第一次大于800, 那么321-1就是我要的结果, html里面320个字的高度就是小于800的最大值!
这个方法笨拙,速度超级慢! 所以在此请教各位了!

我想过用折半查找来实现, 不过这个判断条件不好加呀!
比如我定死 min=0, max=5000, 然后 middle = min + ((max-min)/2);
然后一般的折半查找都是判断这个 middle 是否等于某个数来判定! 我这个吧, 从html取文字求的高度不一定刚刚好等于这个800, 只要是小于800的最大值就ok, 所以这个条件大于也不是, 小于也不是!

可能也是我数据结构没学好, 呵呵! 或许折半就可以实现, 等待各位的建议和帮助! 请教了!!!
...全文
308 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangling92 2011-12-05
  • 打赏
  • 举报
回复
哈哈! 我自己解决了, 还是用二分法查找, 修改了一点点传统的二分法! 目前max定死6000的情况下, 循环的次数稳定在12左右, 这比之前的好几百次甚至上千次大大提高了效率!

多谢各位的意见!
角斗士 2011-12-05
  • 打赏
  • 举报
回复
这么折腾,容器宽度固定的话,直接计算字的长度就好了,你需要的高度能放多少个字,限制一下不就好了,算的那么精确干嘛。
    var txt = "这是我要加载的文字";
if(txt.length>800)
{
txt = txt.substring(0,800);
}
zhangling92 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luoyehanfei 的回复:]

字本身没有高度的,只有字体大小,多少多少px这样的 。高度应该是DOM元素具备的 。、

我建议采取跳跃式算法 。比如 你DOM元素里有一个DIV,然后DIV里又嵌套了很多的table,div,span之类乱七八糟的元素,如果这个DIV不足800.那么就不循环其里面的DOM元素了,先从里往外循环,而不足800的就不循环其里面的元素。

因为里面的元素肯定没有本身那个不足800的DI……
[/Quote]

div里面的元素不用循环, 直接通过offsetHeight就能取到高度, 循环的是里面的文字, 插入到div里面来判断高度.
还有一个办法能提高效率, 不过判断麻烦了一点!
比如首先不是从1,2,3....往后取字求高度判断, 而且首先第一次给一个大点的数, 比如, 第一次我就取500个字, 求高度, 判断是大于还是小于, 如果是大于, 500-100, 如果这时候是小于, 然后就是400+(100/2), 这样能大大提高效率, 这个100是中间数, 可以是200等等.
zhangling92 2011-12-04
  • 打赏
  • 举报
回复
呵呵, 我的最终需求是这样的, 在一个固定宽高的范围(div)内, 动态把文字插入这个范围, 宽定死的情况下, div的高度(offsetHeight)这个会随着字的增加而增加, 所以加到不超过某个高度就停止!

不知道这种需求有没有算法可寻!
zhangling92 2011-12-04
  • 打赏
  • 举报
回复
谢谢各位的意见, 我就是取一个html里面一个div的offsetHeight来判断的, 而这个div里面的文字是通过js动态给的, 给到刚刚好不超过这个高度就停止!
其实这个速度还可以, 慢的遍历5000次左右, 快的300次左右, 300左右几乎是一闪而过, 达到800次就超过1秒了!
feiyuren 2011-12-04
  • 打赏
  • 举报
回复
要查找的是字的高度属性,只有在属性排序后才能用查找算法
如果属性都是随机出现的,只能遍历一遍
好好发掘一下是不是有别的属性可以利用啊
寒飞a 2011-12-04
  • 打赏
  • 举报
回复
字本身没有高度的,只有字体大小,多少多少px这样的 。高度应该是DOM元素具备的 。、

我建议采取跳跃式算法 。比如 你DOM元素里有一个DIV,然后DIV里又嵌套了很多的table,div,span之类乱七八糟的元素,如果这个DIV不足800.那么就不循环其里面的DOM元素了,先从里往外循环,而不足800的就不循环其里面的元素。

因为里面的元素肯定没有本身那个不足800的DIV更接近这个指定高度。
ryfdizuo 2011-12-03
  • 打赏
  • 举报
回复
程序慢是因为每次计算单个汉字的高度。遍历不是瓶颈啊。
你的需求是什么呢?字体高度这种可以求个大概啦,这么搞确实很耗性能。。。
yaoweijq 2011-12-03
  • 打赏
  • 举报
回复
没有看懂。。。
遍历完了排序整背包?
zhoujk 2011-12-03
  • 打赏
  • 举报
回复
HTML 有排版信息,直接取字体的尺寸,然后计算出相应的高度,再进行后继计算就行了吧。如果其间字体有变化,再从该点重新取尺寸数据后计算
oo 2011-12-02
  • 打赏
  • 举报
回复
这个总得遍历完才能找到最合适的吧

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧