需要使用势函数方法找到序列的摊余成本

2024-01-15

有一个包含 n 个操作的序列,如果 i 是 2 的精确幂,则第 i 个操作的成本为 2i;如果 i 是 3 的精确幂,则第 i 个操作的成本为 3i;对于所有其他操作,成本为 1。

Hi first up I want to say that it is a homework problem and I don't want you to solve it for me.

我已经用聚合方法解决了这个问题。为此,我对 2 的幂级数和 3 的幂级数求和,得到摊余成本 10。然后,我使用会计方法对其进行了检查,对于非常长的序列,它没有失败。但我的问题是如何证明它永远不会失败,我可以显示我想要的尽可能长的序列,但它仍然不能保证它在一段时间后不会失败。

我也尝试用势函数方法来解决它,这就是我真正陷入困境的地方,要设计一个势函数,我认为你需要真正的创造力,我找不到一些条件表明在这一点上这将永远成立,需要那里也有一些帮助。

只需一些关于如何在会计方法中证明它以及如何设计潜在功能的想法就足够了。 谢谢


首先,暂时忘掉“1 用于所有其他操作”和“3 的精确幂”位。如果当 i 是 2 的精确幂时,成本仅为 2i 会怎样?

好吧,假设我们假设每次操作花费四。也就是说,对于每次操作,我们将四个硬币放入“IOU 堆”中...然后,当我们达到 2 的实际幂时,我们使用这些硬币来“支付”。(这是描述势函数方法的一种方式。)

步骤1:存入四枚硬币。需要支付2*1=2,所以我们的币堆是2。

步骤2:再存入四枚硬币。需要支付 2*2 = 4,所以我们的堆又是 2。

第三步:存入四枚硬币。桩现在有六枚硬币。

第四步:存入四枚硬币。现在一堆硬币有十个,但 4 是 2 的幂,所以是时候支付 4*2 = 8,所以我们的一堆硬币又减少到两个硬币。

步骤 5-7:每人存入 4 个硬币。现在总共有 14 个硬币。

步骤8:存入4个币(总计=18),花费8*2=16,再次剩下2个币。

很容易证明这里的稳定状态是我们不断将代币消耗到一个常数 (2),但我们永远不会低于这个值。因此,每次操作的摊余成本为四个单位。

现在,假设当 i 是 2 的幂(否则为零)时,操作 X 的成本为 2i。假设当 i 是 3 的幂(否则为零)时,操作 Y 的成本为 3i。假设操作 Z 的成本为 1,除非 i 是 2 的幂或 3 的幂。观察您的问题相当于执行操作 Xand Y and每次迭代的 Z...因此,如果您可以分别计算出 X、Y 和 Z 的摊余成本,则只需将它们相加即可得到总体摊余成本。

我刚刚给了你X;我把 Y 和 Z 作为练习。 (虽然我不相信最终答案是10。接近10,也许......)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要使用势函数方法找到序列的摊余成本 的相关文章

  • Python 给定 k 个分区的整数分区

    我正在尝试寻找或开发Python 的整数分区代码 仅供参考 整数分区将给定整数 n 表示为小于 n 的整数之和 例如 整数5可以表示为4 1 3 2 3 1 1 2 2 1 2 1 1 1 1 1 1 1 1 我为此找到了许多解决方案 ht
  • 线性代数如何在算法中使用?

    我的几个同行都提到 学习算法时 线性代数 非常重要 我研究了各种算法并学习了一些线性代数课程 但我没有看到其中的联系 那么线性代数如何应用在算法中呢 例如 图的连接矩阵可以带来哪些有趣的事情 三个具体例子 线性代数是现代 3D 图形的基础
  • 将嵌套字典中的所有键从camelCase转换为snake_case

    我有一本类似这样的字典 firstName abc lastName xyz favoriteMovies Star Wars The lone ranger favoriteCountries country China capitalC
  • 快速求解子集和

    考虑这种解决子集和问题的方法 def subset summing to zero activities subsets 0 for activity cost in activities iteritems old subsets sub
  • 使用主方法求解 T(n) = 2T(n/2) + n/log n 和 T(n) = 4T(n/2) + n/log n 之间的差异

    我最近偶然发现了一个资源 其中 2T n 2 n log ntypeMM 宣布复发无法解决 我接受它作为一个引理 直到今天 另一种资源被证明是矛盾的 在某种意义上 根据资源 下面的链接 其中的 Q7 和 Q18 是建议 分别在问题中的1和2
  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 点集子集的最小周长凸包

    给定平面上的 n 个点 没有 3 个共线 给定数字 k 找到 k 个点的子集 使得 k 个点的凸包在 k 个点的子集的任何凸包中具有最小周长 我可以想到一个简单的方法 运行时间为 O n k k log k 找到大小为 k 的每个子集的凸包
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • 时间复杂度和运行时间有什么区别?

    时间复杂度和运行时间有什么区别 它们是一样的吗 运行时间是指程序运行所需的时间 时间复杂度是对输入大小趋于无穷大时运行时间渐进行为的描述 您可以说运行时间 是 O n 2 或其他什么 因为这是描述复杂性类和大 O 表示法的惯用方式 事实上
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 7 张牌扑克手牌评估器

    有谁知道评估 7 张牌扑克牌的快速算法吗 这比简单地暴力检查 7 张牌中每 21 个 5 张牌的组合更有效 Cheers Pete 我写了一篇JavaScript 核心评估方法仅使用位操作 因此速度非常快 考虑到这一点 查看 21 种组合还
  • 生成所有多集大小为 n 的分区的算法

    我一直在试图找出一种方法来生成多重集的所有不同的大小为 n 的分区 但到目前为止却空手而归 首先让我展示一下我想要实现的目标 假设我们有一个输入向量uint32 t std vector
  • 异或交换可以扩展到两个以上的变量吗?

    我一直在尝试将异或交换扩展到两个以上的变量 例如n变量 但我没有得到比这更好的地方3 n 1 对于两个整型变量x1 and x2你可以像这样交换它们 swap x1 x2 x1 x1 x2 x2 x1 x2 x1 x1 x2 所以 假设你有
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 如何检查是否存在可能的路径?

    我正在开发一个基于 javascript 的实验性游戏 玩家必须在二维平铺地图上移动才能退出 请随意检查这个小提琴并演奏 http jsfiddle net moonlife 74vLd 我只是随机放置障碍物 但有时障碍物会挡住玩家和出口之
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • shell脚本中关联数组的时间复杂度

    我想知道在 shell 脚本中使用关联数组时如何构造 实现 另外 我想知道基于 shell 脚本的关联数组的时间复杂度是否是最佳的 因为我们可以使用字母和数字作为它们各自的键 编辑 他们使用什么哈希函数 如果您使用关联数组 则不能通过 使用
  • 实施二分查找有哪些陷阱? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 二分查找比看起来更难实现 虽然二分搜索的基本思想相对简单 但细节可能出人意料地棘手 Donald Knuth 新的二分搜索实现中最有可
  • 在java中使用BUBBLE SORT对二维字符串数组进行排序

    类似的问题已经被问过 但从来没有关于二维字符串数组 因此在尝试了很长时间之后我找不到我想要的 我正在尝试使用 BubbleSort 对 java 中的 2D 字符串数组进行排序 作为输入 我收到一个二维字符串数组 一个表 以及您应该排序的
  • 解开 Knuth 的结:如何重构意大利面条式代码?

    这个问题的灵感来自如何将流程图转化为实施 https stackoverflow com questions 36647765它询问如何通过算法消除goto代码中的语句 这answer https stackoverflow com a 3

随机推荐