百科问答小站 logo
百科问答小站 font logo



有哪些算法或数据结构是ACM大牛们在比赛中创造出来的? 第1页

  

user avatar   hqztrue 网友的相关建议: 
      

完全背包问题(unbounded knapsack)的算法。最近投paper查了一些东西,神奇地发现在这个基础问题上ACM界的进展居然领先学术界了。

完全背包问题:给定 种物品,第 种物品的重量为 ,价值为 ,数量无限,从中选出总重不超过 的一些物品使总价值最大化。以下假设 为正整数。

众所周知这个问题有一个 复杂度的动态规划算法。但是我们还可以研究这个问题关于其他参数的复杂度:令 表示单个物品的最大重量,我们想知道有没有算法的复杂度只跟 和 有关,而和 无关,这样我们就可以处理 非常大的情形了。

理论界我能查到的一些进展有:

2009: Arie Tamir[1]利用整数背包和分数背包之间的一些联系,给出了一个复杂度为 的算法。看起来这是第一个给出复杂度为 形式的work。

2018: Bateni et al.[2](STOC)给出了复杂度为 的算法。(话说其实可以简化为 ,因为对于unbounded的情况我们总可以wlog assume ,作者在倒腾自己lemma的过程中还是不够细啊)。其核心思想为利用鸽巢原理得到的以下引理:

Lemma 1. 令 为收益比( )最高的那个物品。那么一定存在一个最优解满足选取的其他物品的重量总和 。

2018: Eisenbrand和Weismantel[3](SODA)利用Steinitz Lemma也证明了以上的Lemma 1。当然这只是他们主要结果的一个小小小推论(他们结果的推论就可以导出Lemma 1的高维情形)。

2019: Axiotis和Tzamos[4](ICALP)给出了一个复杂度为 的算法(更准确的复杂度为 ,这个奇怪的分母是从(min,+)-convolution的一个著名结论那里来的,注意这个分母可以吸收掉分子上的一个 项)。算法的核心思想和下文将要讲到的cf上的那道题是一样的,所以等会再说。这个算法的running time match上了[5]和[6]给出的conditional lower bound(不存在 复杂度的算法),所以这个问题(终于)就算做完了。


OI/ACM界的成果:

2016: 知乎上 @LightGHLi 的这个回答

给出了Lemma 1的一个证明,注意这个时间就已经比[2,3]早了,并且下方评论区中有知友提示这个思想早有人出过很多遍了。(印象中我初高中的时候见过类似的东西,很像 @wwwwodddd 说的那个,反正当时我是没做出来)。这个算法最早出现的时间还有待考证?大家努力找找或许能比09年还早... 那就能完爆理论界了。

update. 评论区提示这个思想在2006年的Usaco Dec The Fewest Coins一题中就已经出现过了,不过用来解决的问题是knapsack的一个特殊情况coin changing。

2016: codeforces上2016 USP Try-outs的L题考察了完全背包问题在 较小, 很大时的解法。题解中给出了 的做法:(我终于找到题解链接了,可惜是用葡萄牙语写的,所以还是贴个网上搜到的截图吧。这是个巴西的比赛,L题出题人是Arthur Nascimento,题解作者是Yan Soares Couto。)

算法的核心思想是尽量把重量均分成两半然后递归。上图中的 是本文的 , 是本文的 。结合Lemma 1我们可以wlog assume ,总复杂度为 。这和Axiotis和Tzamos[4]的算法是一样的(在朴素实现(min,+)-convolution的情况下),且出现时间更早。

尾声:利用我paper的结论可以在 的时间内对所有 求出最优解。算法非常简单,但是正确性分析并不显然,用到了一些数论工具。代码在这里压到8行之后顺利成为了cf上的最短提交。


References

[1] Tamir A. New pseudopolynomial complexity bounds for the bounded and other integer Knapsack related problems[J]. Operations Research Letters, 2009, 37(5): 303-306.

[2] Bateni M H, Hajiaghayi M T, Seddighin S, et al. Fast algorithms for knapsack via convolution and prediction[C]//Symposium on the Theory of Computing (STOC). 2018.

[3] Eisenbrand F, Weismantel R. Proximity results and faster algorithms for Integer Programming using the Steinitz Lemma[C]//Proceedings of the Twenty-Ninth Annual ACM-SIAM Symposium on Discrete Algorithms (SODA), 2018: 808-816.

[4] Axiotis K, Tzamos C. Capacitated Dynamic Programming: Faster Knapsack and Graph Algorithms[C]//46th International Colloquium on Automata, Languages, and Programming (ICALP), 2019.

[5] Cygan M, Mucha M, Wegrzycki K, et al. On Problems Equivalent to (min,+)-Convolution[C]//44th International Colloquium on Automata, Languages, and Programming (ICALP), 2017, 80: 22.

[6] Künnemann M, Paturi R, Schneider S. On the Fine-Grained Complexity of One-Dimensional Dynamic Programming[C]//44th International Colloquium on Automata, Languages, and Programming (ICALP), 2017.




  

相关话题

  for 循环的 "for" 是什么意思?为什么用这个词? 
  C++ 中,如果指针换了被指向的东西,那被指向的原来的东西(是被 new 出来的)所占的内存会立刻被释放吗? 
  阿里巴巴没有能力开发出媲美linux的操作系统吗?有的话为什么不开发? 
  想自学编程怎样下手? 
  热爱编程的程序员,早期是因为什么对编程产生兴趣的? 
  我发现设计模式一个很奇妙的情况,不知各位知友遇过没? 
  什么是 Agile Software Development(敏捷软件开发)? 
  给人指路,说左右和说东西南北在算法上哪个更优? 
  如何用一句话说明什么是面向对象思想? 
  python是用C实现的,Java是用C++实现的,那为什么不直接用C或C++呢? 

前一个讨论
歼10C和米格-29UPG谁战斗力更强?
下一个讨论
在小说中,如果庞统没有英年早逝,而是活到了跟诸葛亮一样的年纪,那么三分天下的格局到后期会有什么变化?





© 2024-11-22 - tinynew.org. All Rights Reserved.
© 2024-11-22 - tinynew.org. 保留所有权利