基于

时间:2017-12-04 18:37:16

标签: algorithm sorting linear

我的任务是为基于比较的算法编写伪代码,该算法对数组进行解组,首先对数组进行排序,然后使用以下算法进行混洗。算法运行时间需要为theta(n)。

Shuffle(int[] A) 
n1 = A.length+1 / 2 // floordiv
n2=A.lenght-n1
L = L[n1]
R = R[n2]
L[1...n1] = A[1...n1]
R[1...n2] = A[n1+1...A.length]
i=j=1;
for k=1 to A.length do
  b=Random(0,1)  // returns 0 or 1 equally likely
  if(b == 0 and i<= n1) or j>n2 then
     A[k] = L[i]
     i++;
  else
     A[k] = R[j]
     j++;

我发现在拖曳A后,左侧Subarry L的索引为i的每个项目位于A'[i ... n2 + i]之间。 并且来自右子阵列R的索引i的每个项目位于A'[i-n2 ... i]之间。 我知道解决方案涉及找到中位数,但我不明白这会有什么帮助。

我也知道在最坏情况线性时间内的选择(来自Cormen的算法导论),但我如何将其结合起来以获得正确的算法呢?

1 个答案:

答案 0 :(得分:0)

混洗数组不会破坏 cells = [] with tf.name_scope("cell_1"): cell1 = tf.contrib.rnn.LSTMCell(self.embd_size, state_is_tuple=True, initializer=self.initializer) cell1 = tf.contrib.rnn.DropoutWrapper(cell1, input_keep_prob=self.input_dropout, output_keep_prob=self.output_dropout, state_keep_prob=self.recurrent_dropout) cells.append(cell1) with tf.name_scope("cell_2"): cell2 = tf.contrib.rnn.LSTMCell(self.n_hidden, state_is_tuple=True, initializer=self.initializer) cell2 = tf.contrib.rnn.DropoutWrapper(cell2, output_keep_prob=self.output_dropout, state_keep_prob=self.recurrent_dropout) cells.append(cell2) with tf.name_scope("cell_3"): cell3 = tf.contrib.rnn.LSTMCell(self.embd_size, state_is_tuple=True, initializer=self.initializer) # cell has no input dropout since previous cell already has output dropout cell3 = tf.contrib.rnn.DropoutWrapper(cell3, output_keep_prob=self.output_dropout, state_keep_prob=self.recurrent_dropout) cells.append(cell3) cell = tf.contrib.rnn.MultiRNNCell( cells, state_is_tuple=True) output, self.final_state = tf.nn.dynamic_rnn( cell, inputs=self.inputs, initial_state=self.init_state) R数组中元素的顺序。它们都包含在混洗数组中,但它们的元素是交错的。

了解这一事实,您可以计算中位数(可以在线性时间内完成),然后再用它来重新创建LR,从而撤消改组。