在我用无名的语言编写的程序中,我有一个宽度未知的文本块,而我所知道的是这个文本块的最大宽度。鉴于此信息,我需要找出该文本可能的最小可能宽度(假设我不能使用字符/字形的度量或字符数)。到目前为止,我只是有一个强力解决方案,如下所示:
for (int i = .1; i < maxTextWidth; i += .1)
{
if (textFitsInGivenWidth(text, i))
{
textWidth = i;
break;
}
}
我想尽可能地尝试优化它。我的第一个想法是使用二进制搜索,但我无法以正确的方式实现它(并且我不确定它是否可能)。有没有人对我在这里做什么有任何建议,只使用我在上述解决方案中给出的内容来改善运行时间?
答案 0 :(得分:2)
二进制搜索确实是答案。
http://en.wikipedia.org/wiki/Binary_search_algorithm
对于整数二进制搜索,它可以是:
minW=0, maxW=maxTextWidth
while(minW<=maxW){
mid=(minW+maxW)/2;
if (textFitsInGivenWidth(text, mid)){
maxW=mid-1;
}else{
minW=mid+1;
}
}
textWidth=minW
这个想法是,如果你有textFitsInGivenWidth(text, mid) == True
,
然后您必须拥有textFitsInGivenWidth(text, i) == True
所有i>=mid
,
如果它是假的,则textFitsInGivenWidth(text, i) == False
i<=mid
所以我们每次检查要检查的间隔的中间位置,并将间隔减半。时间是O(logN),其中N = maxTextWidth
更新:对于浮动支持,请参阅以下示例:
float minW=0, maxW=maxTextWidth
while(1){
if (maxW-minW<0.05)
break;
float mid=(minW+maxW)/2;
if (textFitsInGivenWidth(text, mid)){
maxW=mid;
}else{
minW=mid;
}
}
textWidth=minW
并获得.1的精度,只需将最后一行更改为:
textWidth=int(minW*10)/10.0