当前位置: 首页 > 面试题库 >

使用哪种算法确定使系统进入“零”状态所需的最少操作数?

濮阳赞
2023-03-14
问题内容

这是一个更通用的问题,不是特定于语言的。有关想法和使用算法的更多信息。

系统如下:

它在一群朋友之间登记小额贷款。Alice并且Bill要去吃午餐,比尔的卡不起作用,所以爱丽丝付了10美元的饭钱。
第二天BillCharles彼此相接的火车站上,Chales没有钱票,所以Bill给他买一个,$
5。当天晚些时候,她从朋友那里Alice借了5美元Charles和1美元,Bill给她的朋友买了礼物。

现在,假设他们都在系统中注册了该 交易 ,则如下所示:

Alice -> Bill $10
Bill -> Alice $1
Bill -> Charles $5
Charles -> Alice $5

因此,现在,唯一需要做的就是BillAlice4美元(他给了她1美元,然后Charlie 5 美元 转给
Alicealredy),它们就处于初始状态。

如果我们将其扩展到具有多个事务的许多不同的人,那么获得最少事务的最佳算法是什么?


问题答案:

实际上,这看起来像是双重录入会计概念可以帮助完成的工作。

您的交易可以构造为簿记条目,因此:

                          Alice  Bill  Charles  Balance
Alice   -> Bill    $10      10    10-       0        0
Bill    -> Alice    $1       9     9-       0        0
Bill    -> Charles  $5       9     4-       5-       0
Charles -> Alice    $5       4     4-       0        0

那里有。在每笔交易中,您要贷记一个分类帐帐户,然后借记另一个帐户,以使余额始终为零。最后,您只需算出要应用于每个帐户的最小交易数即可将其恢复为零。

对于这个简单的案例,这是从Bill到Alice的简单4美元转帐。您需要做的是,每增加一笔交易,至少将一个帐户(最好是两个)减少到零。假设您遇到了更复杂的事情:

                          Alice  Bill  Charles  Balance
Alice   -> Bill    $10      10    10-       0        0
Bill    -> Alice    $1       9     9-       0        0
Bill    -> Charles  $5       9     4-       5-       0
Charles -> Alice    $5       4     4-       0        0
Charles -> Bill     $1       4     5-       1        0

那么所需的交易将是:

Bill     -> Alice   $4       0     1-       1        0
Bill     -> Charles $1       0     0        0        0

不幸的是,在某些州,这种简单的贪婪策略无法产生最佳解决方案(j_random_hacker为指出这一点而赞誉)。一个例子是:

                 Alan  Bill  Chas  Doug  Edie  Fred  Bal
Bill->Alan   $5    5-    5     0     0     0     0    0
Bill->Chas  $20    5-   25    20-    0     0     0    0
Doug->Edie   $2    5-   25    20-    2     2-    0    0
Doug->Fred   $1    5-   25    20-    3     2-    1-   0

显然,这可以逆转为四步(因为要到达那只需要四步),但是,如果您不明智地选择了第一步(Edie->Bill $2),那么您将获得的最低限度是五步。

您可以使用以下规则解决此 特定 问题:

  • (1)如果可以消灭两个天平,请html" target="_blank">执行此操作。
  • (2)否则,如果您可以消灭一个天平并设置自己以下一步消灭两个天平,请执行此操作。
  • (3)否则,请清除任何一种余额。

这将导致以下顺序:

  • (a)[1]不适用,[2]可通过实现Alan->Bill $5
  • (b)[1]可以用完成Chas->Bill $20
  • (c)和(d),与道格,伊迪和弗雷德类似的推理,总共进行了四步。

但是,这仅是因为可能性很小。随着人数的增加和小组之间的相互关系变得越来越复杂,您很可能需要进行详尽的搜索,以找到所需的最小移动次数(基本上是上述规则1、2和3,但已扩展以处理更多的深度)

我认为这是在所有情况下为您提供最少数量交易的条件。但是,可能不需要 最佳
答案(在这种情况下,最好的意思是最大“每单位成本”)。可能即使是基本的1/2/3规则集也可以为您的目的提供足够好的答案。



 类似资料:
  • 问题内容: 我正在编写几个节点外壳脚本,供在平台上开发时使用。我们有Mac和Windows开发人员。是否可以在Node中检查变量以便在一个实例中运行.sh文件,在另一个实例中运行.bat? 问题答案: 使用的变量是 在Mac上,变量返回。在Windows上,它返回(甚至在64位上)。 当前可能的值为: 我只是将其设置在我的jakeFile的顶部:

  • 操作系统使用各种算法来有效地调度处理器上的进程。 调度算法的目的 最大CPU利用率 公平分配CPU 最大吞吐量 最短周转时间 最短的等待时间 最短响应时间 有以下算法可用于计划作业。 1. 先来先服务 这是最简单的算法。 最短到达时间的过程将首先获得CPU。 到达时间越少,进程得到CPU的速度越快。 这是非抢先式的调度。 2. 轮循 在循环调度算法中,操作系统定义了一个时间片(片)。 所有的进程将

  • 进程与线程 1. 进程 2. 线程 3. 区别 进程状态的切换 进程调度算法 1. 批处理系统 2. 交互式系统 3. 实时系统 进程同步 1. 临界区 2. 同步与互斥 3. 信号量 4. 管程 经典同步问题 1. 哲学家进餐问题 2. 读者-写者问题 进程通信 1. 管道 2. FIFO 3. 消息队列 4. 信号量 5. 共享存储 6. 套接字 进程与线程 1. 进程 进程是资源分配的基本单

  • 计算机操作系统

  • 在得到答案之前,我冒着这个问题被关闭的风险,但我真的很想知道答案。所以现在开始。 我目前正在尝试学习算法,我开始理解它,但无法与它联系起来。 我理解时间复杂性和空间复杂性。我也理解一些基于伪代码的排序算法 排序算法,如 气泡排序 插入排序 选择排序 快速排序 合并排序 堆垛(一些什么) 我也知道最佳情况和最坏情况(一般情况不多)。 一些在线相关参考资料 不错的地方,用图形显示了上述所有内容。 这也

  • 问题内容: 我想确定正在执行的某些脚本是否正在运行Mac OSX的特定版本。我意识到我可以执行/产生命令: 有没有办法在没有node-exec-sync的情况下同步执行此操作(类似于process.arch)?我意识到同步生成/执行它是一个公认的坏习惯,但是我看不到其他方法。 问题答案: 您可以这样使用 OS模块: 然后将发行版本映射到Mac OS X的特定版本。 达尔文到Mac OS X的映射可

  • 本文向大家介绍C#操作windows系统进程的方法,包括了C#操作windows系统进程的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#操作windows系统进程的方法。分享给大家供大家参考。具体如下: 这段代码演示了如何根据进程名关闭进程和启动进程 希望本文所述对大家的C#程序设计有所帮助。

  • YodaOS Event Event battery.info 表示电池状态,参数描述如下: 参数名称 类型 描述 data string 电池信息 data.batSupported bool 表示是否支持电池 data.batChargingOnline bool 表示是否在充电 data.batLevel int 当前电量 Event app.setup.network-available