我的任务是为基于比较的算法编写伪代码,该算法对数组进行解组,首先对数组进行排序,然后使用以下算法进行混洗。算法运行时间需要为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的算法导论),但我如何将其结合起来以获得正确的算法呢?
答案 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
数组中元素的顺序。它们都包含在混洗数组中,但它们的元素是交错的。
了解这一事实,您可以计算中位数(可以在线性时间内完成),然后再用它来重新创建L
和R
,从而撤消改组。