让人们在电影院就座

2024-04-17

这是基于我读到的一篇关于大型软件公司提出的谜题和面试问题的文章,但它有一个转折......

一般问题:

有一种算法可以让人们在电影院就座,让他们直接坐在朋友旁边,而不是敌人旁边。

技术问题:

给定一个 N × M 网格,用 N * M - 1 项填充网格。每个项目都有一个与其他 N * M - 2 个项目相关的布尔值。在 N 行的每一行中,直接位于其他项目旁边的项目应该与其他项目具有正关联值。然而,列并不重要,即一个项目可以与其前面的项目成为“敌人”。Note:如果项目 A 对 B 具有正关联值,则意味着 B 对 A 也具有正关联值。对于负关联值,其作用相同。保证一个项目与至少一个其他项目具有正关联。Also,在开始将它们放入网格之前,您可以访问所有项目及其关联值。

评论:

从昨天开始我就一直在研究这个问题并思考这个问题,从我的发现让我想起了装箱问题 http://en.wikipedia.org/wiki/Bin_packing_problem有一些附加要求。在一些空闲时间里,我尝试实施它,但一大群“敌人”坐在一起。我确信大多数情况下都必须有至少一对敌人坐在一起,但我的解决方案远非最佳。实际上看起来好像我只是随机化了它。

就我的实现而言,我设置了 N = 10,M = 10,项目数 = 99,并且每个项目都有一个大小为 99 的数组,该数组具有一个随机布尔值,该值引用相应项目编号的友谊。这意味着每个项目都有一个与其自身相对应的友谊值,我只是忽略了该值。

我计划稍后再次尝试重新实现它,我将发布代码。谁能想出一个“好”方法来减少敌人之间的座位冲突?


这个问题是NP-Hard http://en.wikipedia.org/wiki/NP-hard.
Define L={(G,n,m)|there is a legal seating for G in m×m matrix,(u,v) in E if u is friend of v}L 是这个问题作为语言的正式定义。

Proof:
我们将展示哈密​​顿量问题 ≤ (p) 2 路径 ≤ (p) 此问题分两步[哈密尔顿和下面定义的 2 路径],因此我们得出结论这个问题是 NP-Hard。

(1) 我们将证明,在不两次使用任何顶点的情况下找到覆盖所有顶点的两条路径是 NP-Hard [让我们将这样的路径称为:2-path,并将此问题称为 2-path 问题]
减少自哈密​​顿路径问题 http://en.wikipedia.org/wiki/Hamiltonian_path:

input: a graph G=(V,E)
Output: a graph G'=(V',E) where V' = V U {u₀}.

正确性:

  • 如果 G 具有哈密顿路径: v₁→v2→...→vn,则 G' 有 2 条路径: v₁→v2→...→vn,u₀
  • 如果 G' 有 2 条路径,由于 u₀ 与其余顶点隔离,因此存在 路径:v₁→...→vn,是G中的哈密顿量。

因此: G 有哈密顿路径 1 ⇔ G' 有 2 路径,因此: 2 路径问题是 NP-Hard。

(2) 现在我们将证明我们的问题 [L] 也是 NP-Hard:
我们将展示上面定义的 2 路径问题的简化。

input: a graph G=(V,E)
output: (G,|V|+1,1) [a long row with |V|+1 sits].

正确性:

  • 如果G有2条路径,那么我们可以让人们就座,并利用1个座位间隙 用作两条路径之间的“缓冲区”,这将是合法的完美座位 因为如果 v₁ 位于 v2 旁边,则 v₁ v₁→v2 在路径中,因此 (v1,v2) 在 E 中,所以 v1,v2 是友元。
  • 如果 (G,|V|+1,1) 是合法座位:[v₁,...,vk,buffer,vk+1,...,vn] ,G 中有一条 2 路, v₁→...→vk, vk+1→...→vn

结论:该问题是 NP-Hard 问题,因此没有已知的多项式解。

指数解:您可能想使用回溯 http://en.wikipedia.org/wiki/Backtracking解决方案:基本上是:创建大小为|V|-2或更小的E的所有子集,检查哪个是最好的。

static best <- infinity
least_enemies(G,used):
  if |used| <= |V|-2:
     val <- evaluate(used)
     best <- min(best,val)
  if |used| == |V|-2: 
     return
  for each edge e in E-used: //E without used 
     least_enemies(G,used + e)

在这里,我们假设评估(使用)给出了该解决方案的“分数”。如果这个解决方案是完全非法的[即一个顶点出现两次],evaluate(used)=infinity。当然可以进行优化,修剪这些情况。为了获得实际的坐姿,我们可以存储当前的最佳解决方案。

(*)可能有更好的解决方案,这只是一个简单的可能的解决方案,这个答案的主要目的是proving这个问题是NP-Hard问题。

编辑:更简单的解决方案:
创建图表G'=(V U { u₀ } ,E U {(u₀,v),(v,u₀) | for each v in V})[u₀ 是缓冲区的垃圾顶点] 和边的权重函数:

w((u,v)) = 1    u is friend of v
w((u,v)) = 2    u is an enemy v
w((u0,v)) = w ((v,u0)) = 0

现在你已经拥有了经典TSP http://en.wikipedia.org/wiki/Travelling_salesman_problem,这可以是solved http://en.wikipedia.org/wiki/Travelling_salesman_problem#Exact_algorithms in O(|V|^2 * 2^|V|)使用动态规划。

请注意,此解决方案 [使用 TSP] 适用于单排剧院,但它可能是为一般情况找到解决方案的一个很好的线索。

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

让人们在电影院就座 的相关文章

  • 在关键服务器上对字符串进行内存受限的外部排序,并合并和计算重复项(数十亿个文件名)

    我们的服务器生成如下文件 c521c143 2a23 42ef 89d1 557915e2323a sign xml在其日志文件夹中 第一部分是GUID 第二部分是名称模板 我想计算具有同名模板的文件的数量 例如 我们有 c521c143
  • 在仅包含键的字符串的嵌套数组中查找值

    我有一个数组 其中包含一些设置 基本上如下所示 defaults array variable gt value thearray gt array foo gt bar myvar gt array morevars gt moreval
  • Windows 应用程序事实上的标准键盘快捷键列表?

    假设我正在为 Windows 开发一个新的桌面应用程序 是否有我可以查阅的所有 Windows 应用程序都应支持的键盘快捷键列表 来自 Microsoft 或第三方 注意 当我在这里说 所有 Windows 应用程序 时 我的真正意思是 特
  • 需要帮助解决 Project Euler 问题 200 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试制定一个算法来解决 We
  • cordova 使用什么 js“引擎”?

    Cordova 使用什么 JS 引擎 它是特定于平台的还是跨所有平台的一个标准 意味着 iOS 的 safari 和 Android 的 chrome 以及 Windows 可能的 IE 标准 或者跨所有平台的 Cordova JS 引擎
  • C 中的菱形数组排序

    我有以下 C 语言作业 我基本上需要一种方法而不是解决方案 我们有一个 13 x 13 的数组 在数组中 我们有一个需要考虑的菱形形状 该菱形之外的所有内容都初始化为 1 不重要 下面的 5 x 5 数组示例 x x 1 x x x 2 2
  • 未使用的功能会产生什么后果

    我想知道在代码中使用未使用的函数会产生什么 如果有什么后果 如果您查找并删除所有未使用的函数和变量 性能是否会有明显的改进 或者删除未使用的函数和变量只是一个好习惯 未使用的功能不会损害性能 他们让维护代码的人的工作变得更加困难 现代 ID
  • PHP 中两个关联多维数组的值求和

    我正在尝试对两个关联数组的值求和 这是第一个数组 Array Jan 01 2013 gt Array COM gt 100 RES gt 200 Oct 28 2014 gt Array COM gt 300 RES gt 400 这是第
  • 如何从一组重叠的圆计算多边形集?

    这个问题是一些计算细节的扩展这个问题 https stackoverflow com questions 1667310 combined area of overlapping circles 假设有一组 可能重叠的 圆 并且希望计算这组
  • 图中的后边

    I m having a hard time understanding Tarjan s algorithm for articulation points I m currently following this tutorial he
  • 将二维数组拆分为每行数组的最Pythonic方法是什么?

    我有一个函数 foo 返回形状为 1000 2 的数组 如何将其拆分为两个数组 a 1000 和 b 1000 我正在寻找这样的东西 a b foo 我正在寻找一个可以轻松推广到形状为 1000 5 左右的情况的答案 The zip idi
  • 寻找距离原点最近的 100 颗恒星的算法

    首先让我提出正确的问题 问 有一个文件包含超过一百万个点 x y 每个点代表一颗星星 a b 处有一颗行星地球 现在 任务是构建一种算法 返回距离地球最近的 100 颗恒星 您的算法的时间和空间复杂度是多少 这个问题在各种采访中被问过很多次
  • 快速搜索压缩文本文件

    我需要能够在大量压缩文件 txt 中搜索文本 压缩可能会改变为其他东西 甚至成为专有的 我想避免解压所有文件并压缩 编码 搜索字符串并在压缩文件中搜索 这应该可以通过对所有文件使用相同的码本使用霍夫曼压缩来实现 我不想重新发明轮子 所以 任
  • 如何求小于给定数的最大2次方

    我需要找到小于给定数字的最大 2 次幂 我陷入困境 找不到任何解决方案 Code public class MathPow public int largestPowerOf2 int n int res 2 while res lt n
  • 由周期表元素形成的最大单词的算法

    我想为以下问题场景编写一个算法 根据元素周期表元素的名称 找到可以组成的最大单词 符号如Na Ne等应被视为单个元素 这是在一家知名公司的求职面试中被问到的 有人可以帮我解决这个问题吗 我认为更好的方法是检查字典中的每个单词 看看是否可以从
  • 在 C++ 中通过引用传递 std 算法谓词

    我正在尝试从 a 中删除元素std list并保留已删除元素的一些统计信息 为此 我使用列表中的remove if 函数 并且我有一个谓词 我想使用这个谓词来收集统计数据 这是谓词的代码 class TestPredicate privat
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • URL路径相似度/字符串相似度算法

    我的问题是我需要比较 URL 路径并推断它们是否相似 下面我提供了要处理的示例数据 GROUP 1 robots txt GROUP 2 bot html GROUP 3 phpMyAdmin 2 5 6 rc1 scripts setup
  • 以任意顺序匹配可选捕获组

    在解析用户输入的许多情况下 用户有机会向输入添加几个可选标志 这些标志应该以任何顺序接受 如何使用正则表达式对其进行解析 以便每个标志都位于它自己的捕获组中 如果存在 例如 有一个必需的令牌a 然后是 3 个可选标记 可以按任何顺序出现b

随机推荐

  • 将 Python 转换为 R

    我知道有一个模块 rpy 和 rpy2 可以将 R 代码转换为 Python 有什么简单的方法可以做到相反吗 rpy 2 不转换代码 它只允许您通过 python 与 R 进行通信并从 python 中发出 R 命令的接口 鉴于 R 非常依
  • dyld:未加载库:@rpath/SwiftyJSON.framework/SwiftyJSON

    我一直在使用模拟器来测试我的应用程序 今天 我决定在模拟器中使用其他设备来测试它 令我惊讶的是 它在某些设备上启动时崩溃 而在其他设备上却运行得很好 我的应用程序构建运行于 iPad Air 可调整大小的iPad iPhone 5S iPh
  • 在结构体中动态分配结构体

    我正在动态分配一个具有不同结构作为成员的结构 struct a other members struct b struct b基本上持有一个指向另一个的指针struct b 所以想到struct b作为链接列表 如果我动态分配struct
  • 派生类作为默认参数 g++

    请看一下这段代码 template
  • 如何在java中使用twitter4j发布推文?

    我可以使用 twitter4j 登录 twitter 并获取有关登录用户的信息 但我无法从我的应用程序发布推文 我正在使用 Java Web 应用程序来发布推文 请参阅下面我使用的代码 String ACCESS TOKEN ttttttt
  • boost read_until 不会在分隔符处停止

    我使用 boost read until 函数来促进通过套接字接收和解析 HTTP 消息 所以我是什么trying要做的就是从套接字中 read until 直到 r n 我认为应该给我一行 HTTP 标头 每个 HTTP 标头行以 r n
  • 如何在 Windows 计算机上编译适用于 Linux 的 .NET Core 应用程序

    我正在 Windows 10 计算机上开发一个 NET Core 应用程序 使用 Visual Studio 2015 update 3 Microsoft NET Core 1 0 1 VS 2015 Tooling Preview 2
  • 是否可以在具有 $elemMatch 投影的同一集合上使用查询投影?

    我知道您可以使用以下方法限制子集合数组中的项目 elemMatch http docs mongodb org manual reference operator projection elemMatch 作为投影 当这样使用它时 它会返回
  • 分割视图控制器必须是根视图控制器

    每当我尝试以模态方式呈现 UISplitViewController 时 应用程序就会崩溃 因此它必须始终是根视图控制器 谁能证实这一点吗 来自Apple iPad 编程指南 http developer apple com iphone
  • ROracle dbWriteTable 为 R DATE 列创建 Oracle TIMESTAMP 列

    我正在尝试在 Windows 7 64 位上使用 64 位 R3 0 0 中的 ROracle 包 1 1 10 将一些数据上传到我的 Oracle 11g 数据库 ROracle 帮助dbWriteTable states 日期和 POS
  • 在 Pandas 图中添加图例

    我正在使用 Pandas Plot 绘制密度图 但我无法为每个图表添加适当的图例 我的代码和结果如下 for i in tickers df pd DataFrame dic 2 i mean np average dic 2 i std
  • Telegram (Telesharp) - 海量请求(讨论防洪限制)

    我在用着TLSharp https github com sochix TLSharp用于连接到 Telegram 服务 我想搜索 400 000 个频道 请致电服务人员搜索用户异步40万次 我每 15 秒调用一次此服务 但我得到了 1 天
  • Python 读取命名为 PIPE

    我在 linux 中有一个命名管道 我想从 python 中读取它 问题在于 python 进程连续 消耗 一个核心 100 我的代码如下 FIFO var run mypipe os mkfifo FIFO with open FIFO
  • 如何解决 Heroku 上部署的 python 应用程序上的“500 内部服务器错误”?

    基本上 我有一个即将到来的学校项目 任何计算机科学主题 我决定构建一个元数据查看器 我不是程序员或编码员 我的编码课程今年开始 这个项目只是为了介绍 我可以使用在线资源 所以 我刚刚看到了这个GitHub 存储库 https github
  • 如何 git 推送 reflog?

    有没有办法将引用日志推送到远程 这似乎是一件非常有用的事情 但我不知道如何做到这一点 我正在设想类似的事情git push include reflogs 最后 我希望遥控器在推送时有一份引用日志的逐字副本 我尝试使用 mirror 但是
  • 如何使用 Qt 使用鼠标更改网格布局单元格的大小?

    我使用网格布局 水平和垂直 我喜欢这样一个事实 调整窗口大小时会填充整个窗口内容 但这个扩展管理不善 我经常想只改变网格布局中一列的大小而不改变窗口的大小 例如在 Windows 资源管理器中 有两列 左侧的目录列表及其从左侧到右侧的内容
  • 将 pandas groupby 结果合并回 DataFrame

    我有一个看起来像这样的数据框 idn value 0 ID1 25 1 ID1 30 2 ID2 30 3 ID2 50 我想在此框架中添加另一列 即按 idn 分组的最大 值 我想要一个看起来像这样的结果 idn value max va
  • SD卡传输(存储空间不足)

    我试图让我的应用程序能够移动到 SD 卡 到目前为止 我已将属性 android installLocation auto 添加到我的清单文件中 当我尝试在手机上将应用程序的存储选项从内部移动到外部 75MB 时 可以选择移动它 但在完成
  • 通过 HTTPS 的 Ajax GET 请求

    我怎样才能发送ajaxGET请求结束HTTPS get抛出这个 XMLHttpRequest cannot load https Origin null is not allowed by Access Control Allow Orig
  • 让人们在电影院就座

    这是基于我读到的一篇关于大型软件公司提出的谜题和面试问题的文章 但它有一个转折 一般问题 有一种算法可以让人们在电影院就座 让他们直接坐在朋友旁边 而不是敌人旁边 技术问题 给定一个 N M 网格 用 N M 1 项填充网格 每个项目都有一