2014-12-19 4 views
-2

У меня есть исходный массив плиток, заказанных [строка, столбец] как этотмассив двоичного расслоения плотной вставка сортируется по строкам и столбцам

[0,1] [0,2] [0,3]

[1,1] [1,2] [1,3]

мне нужно двоичные элементы вставки упорядоченных по строкам и Colum как этого

  • binaryInsert ([0,0])

  • binaryInsert ([1,0])

и ожидаемый результат будет массив заказаны как этот

[0,0] [0,1] [0,2] [0, 3]

[1,0] [1,1] [1,2] [1,3]

в основном нужно иметь возможность добавлять строки и столбцы в каждом направлении (сверху, справа, слева , вниз), но всегда упорядочивается, как показано ниже.

я могу преобразовать строки и COLS одному значению с помощью этой функции

function coordToOrder(row,col,numCols){ 
 
\t return col+initCols*row 
 
} 
 

 
var initCols = 5; 
 

 
var order = coordToOrder(1,4,initCols); 
 

 
alert(order)

но если мне нужно вставить плитку при заказе 10 и уже вставили мне нужно, чтобы увеличить следующий.

Я пытаюсь использовать двоичное решение вместо функции сортировки, потому что это быстрее.

Благодарим за помощь!

+0

Попробуйте нанимать программиста – KooiInc

+0

Так или иначе, это звучит как домашнее задание. что ты уже испробовал? Покажите код, укажите нам, где вы заблокированы, и мы будем готовы помочь вам. Мы не можем просто написать ваш код для вас. Это стратегия обучения POOR в любом случае – Patrice

+0

Я имею в виду вот так http://machinesaredigging.com/2014/04/27/binary-insert-how-to-keep-an-array-sorted-as-you-insert-data-in -it/но с использованием двух факторов и да, я новичок –

ответ

1

Подсказка: Ваша реализация любой процедуры сортировки, включая двоичную вставку, должна будет обеспечить отношение порядка «<» на ваших плитках. В качестве первого шага используйте эту функцию сравнения, которую вы можете использовать для сортировки тестовых данных через standard JavaScript sort.

Затем попытайтесь реализовать свою двоичную вставку.

var a = [ [0,1], [0,2], [0,3], [1,1], [1,2], [1,3] ]; 

var cmp = function(a, b) { 
    if (a[0] == b[0]) { 
    return a[1] - b[1]; 
    } 
    return a[0] - b[0]; 
}; 

Тогда, например:

a.push([0,0]); 

дает

[[0, 1], [0, 2], [0, 3], [1, 1], [1, 2], [1, 3], [0, 0]] 

затем

a.sort(cmp); 

дает

[[0, 0], [0, 1], [0, 2], [0, 3], [1, 1], [1, 2], [1, 3]] 

далее

a.push([1,0]); 
a.sort(cmp); 

дает

[[0, 0], [0, 1], [0, 2], [0, 3], [1, 0], [1, 1], [1, 2], [1, 3]] 
+0

Ваша функция может быть сведена к 'var cmp = function {var f = 0 + (a [0] == b [0]); return a [f] - b [f]; }; 'но это не так быстро, как ваше. Ваш ответ лучше для общих целей, моя сокращенная версия лучше для минимизации кода. –

+0

Спасибо за этот ответ, но я уже пробовал с функцией сортировки и должен замедляться для своей цели. Я думаю, что это будет более быстрое решение двоичной вставки, но я не могу понять, как 2 с 2 фактора (строки, столбцы) –

+0

@AngeloBosio a) Я предложил вам использовать 'sort()' только для тестирования. Вам понадобится 'cmp()' для всех алмазов в блок-схеме, где выполняется сравнение. б) Я бы не ожидал, что результат будет намного быстрее, 'sort()', скорее всего, будет использовать некоторый метод сортировки O (log n). – mvw

Смежные вопросы