【问题标题】:Algorithm to sort rows and cols by similarity按相似度对行和列进行排序的算法
【发布时间】:2016-08-01 08:03:24
【问题描述】:

我遇到了a spreadsheet,它解释了一种对包含二进制数据的矩阵的行和列进行排序的方法,以便最小化连续行和列之间的更改次数。

例如,开头为:

在电子表格的选项卡中描述的 15 个手动步骤后,得到下表:

我想知道:

  1. 此算法或方法的通用名称是什么?
  2. 如何将其应用于更大的表(其中 2^n 会溢出...)
  3. 如何将其推广到非二进制数据,例如使用 Levenshtein 距离?
  4. 如果有任何代码链接(Excel VBA,Python,...)已经实现了这个(否则我会写它...)

谢谢!

【问题讨论】:

  • 这是 {0,1}^n 中的欧几里得哈密顿路径;我认为可能存在常数因子逼近算法,因为 hampath 与 TSP 密切相关(hampath 和 TSP 对于一般图都是 np-hard),并且我们有 TSP 的逼近算法,但不要期望以最佳方式解决它 - 虽然我不完全确定这个特定空间的硬度证明是否存在,如果这是在 P 中,我会感到惊讶。我不知道 VBA 能做什么,所以我不能告诉你是否可以实现近似算法在那里。
  • 再看一遍,距离其实不是欧几里得,而是汉明距离;我不知道那个硬度证明或近似算法,但它们可能存在。
  • 相关:Gray codes,也可作为 n 元变体。
  • 其实我错了;这不是hampath,是TSP不回源,这就是TSP路径问题(文献中可能称为TSPP)。我还可以补充一点,对于非二进制坐标,您的问题正是欧几里得 TSPP;另见this
  • 我不得不说,严格来说,这个“问题”可能不适合 Stack Overflow 格式。我的意思是,它有多个子问题(不鼓励),这些组成问题可以说不是 programming 问题(所以离题),或者太宽泛(正确回答问题需要写太多)。尽管如此,这是一个有趣的问题,看到这个电子表格真是太棒了!

标签: python excel algorithm sorting similarity


【解决方案1】:

你可以用一个向量L = [1, 1, 0, ... 1]来表示每一行,然后用L0L1对应位置的元素个数来定义两行之间的距离d(L0, L1)。这被称为二进制Hamming distance。如果您有非二进制数据,您只需扩展距离的定义,是的,Levenshtein 距离是一种选择。

一旦明确了距离,剩下的问题就是最小化连续行之间的距离。这正是Traveling salesman problem,众所周知是NP-hard(http://www.diku.dk/hjemmesider/ansatte/jyrki/Paper/EKP85.pdf)。

直接解决方案(访问所有排列)是 O(n!),但您可以通过使用动态编程轻松做得更好,例如 Held–Karp_algorithm。还有一些近似算法,例如Nearest_neighbour_algorithm,它可以快速计算出非最优解。

最后,对于实现,您可以轻松地谷歌“旅行推销员 excel/python”并找到许多教程和示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 2016-11-15
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2010-09-22
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多