给定一个整数元素序列S,我需要一个函数来找到索引 i 和索引 j (包括两者)之间的序列的最小元素,使得:nmin(i,j)
- 初始化需要
O(n); - 内存空间
O(n); min(i,j)需要O(log(n)).
请为此提出一个算法。
给定一个整数元素序列S,我需要一个函数来找到索引 i 和索引 j (包括两者)之间的序列的最小元素,使得:nmin(i,j)
O(n);O(n);min(i,j)需要O(log(n)).请为此提出一个算法。
Segmenttree 就是您所需要的,因为它满足您的所有要求。
除此之外,树是动态的,可以支持 O(log n) 的更新。这意味着可以在 O(log n) 中修改某个元素 i 的元素,并且仍然可以检索最小值。
此 TopCoder 教程:< O(n), O(1) > 方法更详细地讨论了您的问题。在符号中,意味着该方法需要 f(n) 复杂度来设置,以及 g(n) 复杂度来查询。
此外,这篇文章再次咀嚼算法:范围最小查询 <O(n), O(1)> 方法(从树到受限 RMQ)。
希望他们澄清你的问题:)
段树正是您所需要的(它可以及时构建O(n),一个查询需要O(log n)时间)。这是一篇关于它的文章:http ://wcipeg.com/wiki/Segment_tree 。
即使有一种算法使用O(n)时间进行初始化和O(1)每次查询的时间,段树也是一个不错的选择,因为它更简单。