【问题标题】:How to have indices of an array, except the elements, when we use n-choose-k? [closed]当我们使用 n-choose-k 时,如何获得数组的索引,除了元素? [关闭]
【发布时间】:2014-12-03 22:28:54
【问题描述】:

我想编写一个算法,它给出一个整数和一个数组作为输入,并增加一些元素。假设我们的数组有 4 个元素。将要增加的选定元素的索引如下(左侧整数是我们的算法输入,右侧整数是选定索引):

1 -> 1
2 -> 2
3 -> 3
4 -> 4
5 -> 1,2
6 -> 1,3
7 -> 1,4
8 -> 2,3
9 -> 2,4
10 -> 3,4
11 -> 1,2,3
12 -> 1,2,4
13 -> 1,3,4
14 -> 2,3,4
15 -> 1,2,3,4

谁知道我如何在 MATLAB 中实现这个算法?

【问题讨论】:

  • 这个问题完全不清楚,但直觉上它让我想起了二进制表示......
  • @EugeneSh。对不起,但我不能更好地声明我的问题。它就像一个时钟。将第一个指针移动到末尾(秒),将产生另一个指针(分钟),依此类推。
  • 好的,现在我开始明白了。您正在尝试以特定方式从 N 个元素中枚举不同的选择。不难,有时间我会写一个方法来做,如果之前没人做的话
  • 是的,这看起来确实像我们从一个对象开始选择独特的对象组合,最多四个对象。我们只是列举了所有可能数量的对象的所有选择。
  • 据我所知,这些元素是您的索引。

标签: arrays algorithm matlab increment indices


【解决方案1】:

我怀疑“指针”是指时钟的箭头,但这并不能让它更清楚。我从您的模式中得到的是您想要 二项式系数,您可以使用 nchoosek 函数获得它们:

array=[1 2 3 4];
for k= 1:numel(array)
    b{k,1} = nchoosek(array,k);
end 

【讨论】:

  • 是的……就是这样。 +1。
  • 这很好而且很有帮助,但是由于计算开销,我不想同时计算所有这些(或至少,不止一个)。我只想每次都获得其中一个。还有其他选择吗?
  • 另外,我怎样才能在我的数组中增加它们?!
  • @MorTezaDM 你想增加什么?
  • @CapeCode 只是放置在索引中的元素。你的代码给了我元素,而不是索引。所以我不能操作我的数组。
【解决方案2】:

我假设您不能一次生成所有组合(以节省内存)。

如果您需要枚举所有组合(以便每个组合出现一次)但您不介意顺序,您可以:

  1. 将计数器从1 增加到2^n-1,其中n 是元素的数量
  2. 获取计数器的二进制表示
  3. 在该表示中查找等于 1 的数字。

代码:

n = 4;
for counter = 1:2^n-1
    comb = find((fliplr(dec2bin(counter,n))=='1'));
    disp([num2str(counter) ' -> ' num2str(comb)]);
end

结果:

1 -> 1
2 -> 2
3 -> 1  2
4 -> 3
5 -> 1  3
6 -> 2  3
7 -> 1  2  3
8 -> 4
9 -> 1  4
10 -> 2  4
11 -> 1  2  4
12 -> 3  4
13 -> 1  3  4
14 -> 2  3  4
15 -> 1  2  3  4

【讨论】:

  • 谢谢,但我需要按照我在问题中提到的方式保留与输入整数相关的选择顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
相关资源
最近更新 更多