|
|
1
5
选择子矩阵以覆盖请求的值是 set covering problem 因此NP完全。你的问题又增加了一个已经很难解决的问题,那就是套的成本不同。 允许对行和列进行排列并不是什么大问题,因为您可以只考虑断开连接的子矩阵。第1行、第4列到第7列和第5行、第4列和第2列是有效的集合,因为您只需交换第2行和第5行并获得连接的子矩阵第1行、第4列到第2行、第7列。当然,这会增加一些约束——并非所有集合在所有排列下都有效——但我不认为这是最大的问题。
维基百科的文章给出了一个不可估计的结果,即该问题在多项式时间内不能比用一个因子更好地解决。
忽略行和列排列的集合数的乐观下限是
所以你能做的最好的就是使用一个启发式算法(维基百科文章提到了一个几乎是最优的贪婪算法),并接受在这种情况下,算法的表现(非常)糟糕。或者你用另一种方法,使用一种优化算法,试着找到一个好的解决方案,用更多的时间。在这种情况下,我建议尝试使用 A* search . |
|
|
2
1
我确信有一个很好的算法可以解决这个问题,但我有自己的直觉:
也: 牢记 有时候最好有两个 重叠 矩形多于一个大矩形,它是它们的超集。例如,当两个矩形仅在一个角重叠时。 |
|
|
3
1
好吧,我对这个问题的理解已经改变了。新理念:
|
|
|
4
0
由于您的值是稀疏的,可能是许多用户要求相似的值吗?在应用程序中缓存是一个选项吗?请求可以通过(x,y)位置的函数散列进行索引,这样您就可以轻松地识别位于网格正确区域内的缓存集。例如,将缓存集存储在树中可以让您很快找到覆盖请求范围的最小缓存子集。然后可以对子集进行线性查找,这是很小的。 |
|
5
0
我将考虑用户请求中提到的n个记录(行)和p字段(cols),设置为p维空间(0,1^p)中的n个点,i坐标为1,如果它有x,并且 identify a hierarchy of clusters ,其中最粗的集群位于根目录,包括所有X。对于集群层次结构中的每个节点,考虑覆盖所有所需列(这是行(任何子节点)x列(任何子节点))的产品。然后,自下而上决定是合并儿童覆盖物(支付整个覆盖物的费用),还是作为单独的请求保留它们。(覆盖层不是连续的列,而是所需的列;也就是说,考虑一个位向量) 我同意Artelius的观点,重叠的产品请求可能会更便宜;我的分层方法需要改进以将其纳入其中。 |
|
|
6
0
我已经做了一些工作,这里有一个明显的O(n^3)贪婪的对称破坏算法(记录和字段分别处理),类似于python的伪代码。
这个想法很简单:我们首先尝试每个记录一个请求,然后进行最有价值的合并,直到没有任何东西值得合并为止。这个算法有明显的缺点,即它不允许重叠的请求,但我希望它在实际情况下(使用+
# given are
# a function cost request -> positive real
# a merge function that takes two pairs of sets (f1, r1) and (f2, r2)
# and returns ((f1 U f2), (r1 U r2))
# initialize with a request per record
requests = [({record},{field if (record, field) is needed}) for all needed records]
costs = [cost(request) for request in requests]
finished = False
while not finished: # there might be something to gain
maximum_gain = 0
finished = True
this_step_merge = empty
# loop onto all pairs of request
for all (request1, request2) in (requests x request) such as request1 != request2:
merged_request = merge(request1, request2)
gain = cost(request1) + cost(request2) - cost(merged_request)
if gain > maximum_gain:
maximum_gain = gain
this_step_merge = (request1, request2, merged_request)
# if we found at least something to merge, we should continue
if maximum_gain > 0:
# so update the list of requests...
request1, request2, merged_request = this_step_merge
delete request1 from requests
delete request2 from requests
# ... and we are not done yet
insert merged_request into requests
finished = False
output requests
这是O(N3*P),因为:
事先谢谢! |