【问题标题】:Greedy Algorithm Optimization贪心算法优化
【发布时间】:2012-11-22 19:19:30
【问题描述】:

我有以下问题:

  • 假设有 n 个项目。
  • 让 Fi(x) 等于您花费后将获得的点数 在项目 i 上工作的 x 个单位时间。
  • 您有 T 个单位的时间来使用和处理您想要的任何项目 喜欢。

目标是最大化您将获得的积分数量,并且 F 函数不递减。

F 函数的边际收益递减,换句话说,在特定项目上花费 x+1 单位时间所获得的总积分的增加将少于在该项目上花费 x 单位时间所获得的总积分增加。

我想出了以下 O(nlogn + Tlogn) 算法,但我应该找到一个在 O(n + Tlogn) 中运行的算法:

sum = 0
schedule[]
gain[] = sort(fi(1))

for sum < T
    getMax(gain) // assume that the max gain corresponds to project "P"
    schedule[P]++
    sum++
    gain.sortedInsert(Fp(schedule[P] + 1) - gain[P])
    gain[P].sortedDelete()

return schedule

也就是说,对初始增益数组进行排序需要 O(nlogn),循环运行需要 O(Tlogn)。我对这个问题的思考比我愿意承认的要多,并且无法提出可以在 O(n + Tlogn) 中运行的算法。

【问题讨论】:

    标签: algorithm dynamic-programming greedy


    【解决方案1】:

    第一种情况,使用堆,构建堆需要O(n)时间,每个ExtractMin和DecreaseKey函数调用需要O(logN)时间。

    对于第二种情况,构造一个 nXT 表,其中第 i 列表示情况 T=i 的解决方案。第 i+1 列应仅取决于第 i 列和函数 F 上的值,因此可在 O(nT) 时间内计算。我没有彻底考虑所有案例,但这应该会给您一个良好的开端。

    【讨论】:

    • 我不知道在线性时间内构建最小/最大堆的能力;非常感谢,这使我的案例 1 的解决方案可以在 O(n + TlogN) 中运行。
    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 2023-04-02
    • 1970-01-01
    • 2022-12-07
    • 2019-04-27
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    相关资源
    最近更新 更多