因此,当我在处理编程竞赛(ACM ICPC等)中的一些实践问题时,人们经常可以采用O(N^2)解决方案,甚至更糟,并使用堆(C++中的priority_queue)或use来降低复杂性。(作为某种优化,在注意到模式中的“某些东西”之后)
例如,在“滑动窗口最大值”问题中,这几乎是:
For each window of size K in an array of size N, compute the maximum.
这里有一个简单的O(NK)算法,一个相当简单的O(nlogn)解决方案(甚至我都可以看到,使用一个堆)和一个O(N)解决方案,使用一个双端队列。
这些原则似乎是基于“丢弃”无用
我有一个考试中的问题,我想知道我的方法是否正确。
Input: graph G(V,E),weight function f:E->R and edge e=(u,v).
output: algorithm that finds a minimum spanning tree with edge e in it.
我的解决方案是运行kruskal的算法,然后添加边e如果它不存在,它应该形成一个圆,因为树是n-1个边,所以我们遍历该圆并删除存在于该圆中的最大边(而不是e)。
我的解决方案正确吗?如果是,怎么证明?如果不是,你能告诉我为什么吗?
(附言:我有这个问题的答案,只是想知道我的方法
广度优先搜索和深度优先搜索是两个相同的算法,除了它们所做的事情,以及它们使用的数据结构。
广度优先搜索:
q := queue
q.append(root node of tree)
while q is not empty:
n := q.pop()
if n is the node being searched for:
return n
if n has children:
c := children of node
for i in c:
q.push(i)
深度优先搜索:
s := sta
使用scala,我尝试将多个元素连接到一个列表中,如下所示
val min = func1()
val max = func1()
val interpol : List[Float] = func2()
val res : List[Float] = (min.toFloat) :: interpolated :: (max.toFloat) :: Nil
由于类型不匹配错误,此语法无法工作。如何将元素预先和附加到列表中(以非常优雅的方式,即不使用列表缓冲区等)?
顺便说一句,我也试过
val res : List[Float] = (min.toFloat) :: interpolate