C ++二维位组数组

时间:2013-06-03 03:34:42

标签: c++ multidimensional-array memoization bitset bitmask

我有一项任务,我们正在处理旅行商问题。 我不会撒谎,我现在正在做的那部分我实际上并不完全明白他们在问,所以很抱歉,如果我奇怪地说出这个问题。 我有点得到它,但不完全。

我们正在计算推销员的近似距离。我们需要创建一个二维数组,我相信比特集?无论如何都要以二进制形式存储值。 0代表城市未被访问过,1代表访问过的城市。

我们已经获得了一个非常有用的算法,如果这里有人可以帮助我完成第一步,我应该能够完成它:

Create memoisation table [N][(1 << N)]

(其中N =城市数量)。 我得到1&lt;&lt; N表示将城市数量(例如5)转换为二进制,然后将该集合向左移动一个位置。

我的主要问题是:

  1. 将N转换为二进制(我认为这是我需要做的?)
  2. 将设置向左移动
  3. 实际创建这些尺寸的二维数组......
  4. 我可能在这里错了,事实上这很可能......任何帮助都表示赞赏,谢谢!

1 个答案:

答案 0 :(得分:0)

以下是一般规则“&lt;&lt;”运算符表示左移和“&gt;&gt;”意味着右移。将任意数字右移1等于除以2,左移任何数字乘以2相当于乘以2.例如,假设数字7(二进制数111)。所以7&lt;&lt; 1将变为1110,即7 * 2 = 14且7>&gt; 1将变为11,即7/2 = 3。

因此,算法将数字N转换为bitset数组,因为二进制是

  1. N mod 2(如果你将N除以2则取余数)
  2. 将余数存储在集合中(即列表,数组,堆栈)
  3. 将N除以2
  4. 如果N / 2> 1,则从步骤1开始用N / 2
  5. 重复
  6. 否则反转阵列就可以了。
  7. 将组合左移动到1,如果你的意思是leftshift加1,你可以用N&lt;&lt; 1

    进行

    这是在C ++中创建二维数组的方法

    [变量类型] TwoDimensionalArray [size] [size];

    对于这个问题,虽然我相信您可能想要了解C ++ bitset,但您可以使用bitset轻松实现它。为此,您只需要弄清楚要使用的位集的大小。例如,如果N的最高值为15,那么您需要一个4的位集大小。因为4位,您可以表示的最大数字是15(二进制1111)。希望这可以帮助。