百科问答小站 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.




  

相关话题

  中国计算机专业的大学生相比于美国差在哪里? 
  程序员应该如何学习算法? 
  鸿蒙系统动了谁的奶酪? 
  矩阵链相乘的时间复杂度为什么末尾是dn呢,是那么算的呢? 
  为什么学了一个学期的c语言,感觉一直都是在用代码去做一些简单的数学题,没有什么实际用途? 
  有哪些让你目瞪口呆的 Bug ? 
  未接触过编程的妹子希望通过做小项目来学习编程,有哪些类型的项目比较适合? 
  为什么英国顶尖大学在acm icpc表现不佳? 
  突然想开一家程序员主题的餐馆,名字就叫程序员的菜,菜名就叫各种语言中的关键字,各位指点一哈,有前途没? 
  学习机器学习应该看哪些书籍? 

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





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