我有一个文本块(任意长度),每当出现时都会以黄色突出显示。我想只显示400字的文本块,但我想用最突出的单词显示块。
有人知道一个好的算法吗?
我有每个突出显示的单词的字符位置,所以算法需要找到不均匀间隔整数的最密集的簇?
答案 0 :(得分:6)
我不知道你怎么知道它们被突出显示但是这是一个简单的O(n)方法我会尝试。
将单词扫描成循环队列(最大容量为400),如果它们被突出显示,则递增计数器,一旦达到队列容量,将必要的单词出列,以便排列下一个单词。当您将突出显示的单词出列时,会减少计数器。跟踪你的计数器在任何时候达到的最大值以及最多400字开始的位置
不太优雅,但相当简单。
答案 1 :(得分:2)
你可以逐字移动平均值(在过去的400个单词中),同时跟踪到目前为止看到的最大值。一旦完成,您的最大值将告诉您使用哪400个单词。
答案 2 :(得分:1)
这并不是你要求的,但我在过去使用过这样的东西,同时搜索单词(charPos指的是单词的起始字符位置)。注意:'/'运算符执行整数除法,即4200/2000 = 2。
if hasKey(charPositionHashtable[charPos/2000]):
charPositionHashtable[charPos/2000]) += 1
else:
charPositionHashtable[charPos/2000]) = 1
搜索完成后,charPositionHashtable
有一堆键/值对,其中包含2000个字符块的“索引”,以及其中找到的单词的计数。取最大值,并使用与该索引对应的块。我认为这比O(n)更好(但我没有对此做过很多分析)。
答案 3 :(得分:1)
你有突出显示的单词的标记..我认为下面是一个好的,快速的方法,因为它不需要“找到”每个单词(做循环循环)。为此,它使用从大量字符而不是单词派生的“块大小”。然后你可以“向上”或“向下”到最近的单词结尾,并且你有你的大块。
我认为,可以更好地完成在样本前面有多少突出显示的标记位于“块大小”内的方法。
伪
string GetHighestDensityChunk(){
// {chunk size} = 400 * average word length
// {possible start positions} = 0, highlighted indicies, and (sample - {chunk size})
int position
int bestPositionSoFar = 0
int maxHighLightedCountSoFar = 0
for each position in {possible start position}
{
highlightedCount = GetNumberOfHighlightedWithinChunkSize(position)
if(highlightedCount > maxHighLightedCountSoFar)
{
maxHighLightedCountSoFar = highlightedCount
bestPositionSoFar = position
}
}
// "round up" to nearest word end
// gives index of next space after end of chunk starting from current best position
{revised chunk size} = sample.indexOf(' ', startingAt = bestPositionSoFar + {chunk size}) - bestPositionSoFar
return sample.substring(bestPositionSoFar, {revised chunk size})
}
int GetNumberOfHighlightedWithinChunkSize(position)
{
numberOfHighlightedInRange = 0
// starts from current position and scans forward counting highlighted indicies that are in range
for(int i= {possible start position}.indexOf(position); i<= {possible start position}.length; i++){
if({possible start position}[i] < position + {chunk size}){
numberOfHighlightedInRange++;
} else {
break;
}
}
return numberOfHighlightedInRange;
}