【问题标题】:Every possible combination in a specific order每个可能的组合都按特定顺序
【发布时间】:2020-09-21 03:14:40
【问题描述】:

所有的想法,所以寻求帮助。所以我有两个表,单列 ID 为 1-29,每个 ID 代表一个同事。我有第三张表,我已经从前两张表中创建了每个记录组合。

我正在苦苦挣扎的部分是我需要按如下方式订购我的第三张桌子,比如第 1 个人调用第 2 个人,第 3 表中的 ID 将如下所示:'1-2',现在我需要制作下一条记录从 2 开始,让第 2 个人呼叫不是第 1 个人(已经被呼叫)的人,并且让第 1 个人不再被呼叫,直到剩下的 28 个人已经被呼叫,以确保每个人都至少被呼叫一次在查看其他组合之前。

这有点难以解释,所以如果需要我愿意详细说明。

对于那些想知道的人来说,这个练习的目的是创建一个“呼叫火车”,让每个人都检查其他人。提前致谢!

【问题讨论】:

  • 如果我理解正确的话,如果你真的想要“所有可能的组合”,那么28! ~= 10^29 组合就差不多了。这可能会占用比世界上所有计算机的总存储空间更多的存储空间。

标签: excel algorithm sorting excel-formula


【解决方案1】:

您可以按如下方式设置调用链:

所以在Stage 2中,1会调用32会同时调用4,等等。在每个阶段,调用者的数量将是前一阶段调用者数量的两倍。

(可以将其映射成树形结构)

编辑#1:

我用这个小的 VBA 宏生成了模式:

Sub Peak()
    Dim stage As Long, i As Long, j As Long, K As Long

    K = 1
    j = 1

    For stage = 1 To 5
        For i = 1 To j
            Cells(K, 1) = i
            Cells(K, 2) = K + 1
            K = K + 1
        Next i
        j = j * 2
    Next stage
End Sub

但基于公式的解决方案也应该是可能的。

编辑#2:

A1中输入1
B1中输入2

A2中输入:

=IF(ROWS($1:2)=2*A1,1,1+A1)  and copy downwards.

B2中输入:

=B1+1 and copy downwards

【讨论】:

  • 有趣的解决方案,我会用什么公式来得到这个?
  • @MarthaEstrada 查看我的EDIT#1:
  • @MarthaEstrada 请参阅我的 EDIT#2 了解纯公式方法。 (无 VBA)
  • 这实际上很有见地,因为我对使用 VBA 很陌生,但是不幸的是,它不能满足我的需要。我需要第 2 列中的最后一个人在第 1 列中进行下一次调用,依此类推,我没有在结果集中得到它。不过,我很感激你的时间,所以谢谢。
  • @MarthaEstrada 这实际上是一个非常有趣的问题.......如果您可以用您想要的结果的小快照更新您的问题,我们可以做出适当的解决方案。
【解决方案2】:

事实证明,29 非常适合这个,因为它是素数。

您所做的是在第一个周期中让每个调用下一​​个,然后在第二个周期中每个调用间隔为 2,然后间隔为 3,依此类推。这导致了这种模式:

1 2 ... 29
1 3 5 ... 28
1 4 8 ... 27
.
.
.
1 29 28 ... 2

你有 28 个呼叫序列,每个可能的呼叫只使用一次。

因此第一条记录是1-2。第二条记录是2-3,以此类推。直到第 29 条记录是 29-1。然后我们开始间隔 2 得到1-3 等等。

我们甚至可以找出一个公式。

一般nth 记录将在i = 1 + (n div 29)th 循环中。 (我在这里使用 PostgreSQL SQL 运算符。div 表示“除法并删除分数”。)它是该循环中的 j = (n mod 29)th 条目(mod 表示整数除法后的余数)。这意味着呼叫从(1 + (j-1)*i) mod 29 开始并转到(1 + j*i) mod 29

【讨论】:

  • 对不起,我不完全理解。
  • @MarthaEstrada 记录 1 是 1-2。记录 2 是 2-3。以此类推记录29是29-1。现在我们的间隔为 2。所以1-3,依此类推。
  • 好的,所以只是为了确认我会遵循这个模式并手动执行这个?
  • @MarthaEstrada 您可以手动操作或计算公式。我已经为您完成了大部分公式的计算。
  • 啊,在移动设备上,没有看到您最初回复的最后一段。让我试试看。 :)
猜你喜欢
  • 2014-07-07
  • 2021-06-05
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多