2013-05-16 8 views
0

Учитывая следующей таблице:Эффективный алгоритм и хранение формат таблицы 3XN

|A|B|C| 
|0|0|1| 
|1|0|3| 
|1|1|1| 
|1|2|1| 
|1|3|1| 
|1|4|2| 
|2|5|1| 

мне нужно придумать наиболее эффективный формат хранения алгоритма и что позволит мне, определить C заданную А и В:

   +-----------+ 
       | BLACK | 
A = 0, B = 0 -> | BOX | -> 1 
       +-----------+ 


       +-----------+ 
       | BLACK | 
A = 1, B = 4 -> | BOX | -> 2 
       +-----------+ 

Алгоритм должен обеспечивать хороший обмен между памятью и эффективностью. Моя первая попытка была сделать хэш из A и B, и использовать его в качестве ключа для карты:

{ 
    "0.0": 1, 
    "1.0": 3, 
    "1.1": 1, 
    "1.2": 1, 
    "1.3": 1, 
    "1.4": 2, 
    "2.5": 1 
} 

Но я сомневаюсь, что это лучший подход (в отношении памяти, выделенной для такой карты, а время поиска , потому что эта таблица может содержать тысячи строк).

Может ли кто-нибудь показать мне лучшее решение?

ответ

1

Хэш-таблица звучит как вполне разумный способ приблизиться к этому, даже для тысяч строк. На каком языке вы используете? Насколько велика ваша таблица и какова была ваша первая попытка?

Есть ли узоры в данных, которые вы могли бы использовать? Каковы возможные диапазоны A, B и C?

Дополнительные данные необходимы.

[Это комментарий не ответ, но, видимо, у меня недостаточно репутация размещать комментарии.]

Обновление включает пример для моей вложенной-массивов идеи:

var table = []; 

function add_entry (A, B, C) { 
    if (!table[A]) 
    table[A] = []; // create if it doesn't already exist 
    table[A][B] = C; 
} 

function retrieve_entry (A,B) { 
    return table[A][B]; 
} 

Это производит структуры, как :

table = [ 
    [ 1 ], 
    [ 3, 1, 1, 1, 2 ], 
    [ undefined, undefined, undefined, undefined, undefined, 1 ] 
]; 

Стандартные JavaScript массивы, будучи только объекты в маскировке, ручка разреженность просто отлично. Поскольку я пропустил ту часть, где B увеличивается равномерно, даже когда изменяется A (я думал, что B каждый раз возвращается к нулю), если вы используете типизированные массивы, вам нужно явно хранить пару (типизированный массив, смещение); вам также необходимо заранее разработать размеры. Это может быть немного грязно, но должно быть прекрасно выполнимо. Он может оказаться или не оказаться более эффективным, в зависимости от того, сколько значений C у вас есть на значение B.

+0

Я использую JavaScript. Сама таблица содержит данные, сгенерированные моим генератором лексера, поэтому она может быть очень большой. Я действительно не оценил производительность, просто мои мысли состояли в том, что это не идеальное решение. Как я уже упоминал, таблица - это таблица переходов для конечного автомата, поэтому нет шаблонов, которые можно использовать. A, B, C может варьироваться от 0 до 65535. – Ruslan

+0

Кстати, я не упомянул, что A, B, C непрерывны (0, 1, 2, 3, n), i. е. в этих значениях нет пробелов) – Ruslan

+1

Измерьте производительность! Если он не слишком медленный, нет смысла добавлять сложность, чтобы ускорить его. Это говорит о том, что ваши ценности последовательны: как насчет некоторых Uint16Arrays? Создайте Uint16Array с отображением B-> C (например, [1,1,1,2] для случая A = 1 выше), затем создайте массив из значений A, которые указывают на массивы значений B. – hexwab