2010-10-25 7 views
5

мне нужна структура данных со следующими свойствами:Какую структуру данных использовать?

  • Доступ к элементам должен быть очень быстрым
  • элементы, которые не добавляют, не следует принимать память (как идеал, размер пустой структуры вблизи ноль)
  • Каждый элемент имеет два целочисленных координат (х, у) (доступ к элементам только ими)
  • Макс количество элементов, известных в момент создания (более 10^3)
  • элемент содержит несколько флоат значений

Было бы хорошо, если бы вы также направили реализацию этой структуры на C или C++.

+1

Это домашнее задание? –

+1

Выберите ваш язык. Нет такой вещи, как C/C++, и реализация этих двух языков будет совсем другой. –

+2

@R .. Ваша точка взята, но этот аргумент ДЕЙСТВИТЕЛЬНО устал. Я все время ссылаюсь на C/C++. Зачем? Поскольку наши пакеты обычно заканчиваются обертками C++ вокруг пакетов C. Я не думаю, что кто-то ужасно обижен, за исключением пуристов в обоих лагерях, у которых есть роскошь выбора одного языка или другого. –

ответ

3

Проверьте это - вы можете изменить тип элемента на float, если это делает все, что вы хотите.

Concise Sparse Matrix Package in C

Для C++ можно использовать Boost.uBLAS - детали sparse_matrix here.

7

Вы ищете sparse matrix?

+1

Хорошая точка. Кроме того, если замечание OP «более 10^3» действительно означает «несколько тысяч», я бы рекомендовал простой 2-й массив. –

1

Если ваши X и Y относительно малы, тогда будет работать двумерный массив указателей. 10000 указателей будут 40K в 32-битном коде.

+0

Даже в режиме 64 бит он может использовать 32-битные индексы. –

1

 

typdef ElementAccessor std::pair<int, int>; 

struct Element 
{ 
    float f1; 
    float f2; 
    //etc. 

}; 

std::map< ElementAccessor, Element > myElementMap; 

Теперь вы можете использовать эту карту в качестве матрицы. ElementAccessor относится к x, y. Просто убедитесь, что этот элемент существует на карте, прежде чем пытаться получить к нему доступ, или по умолчанию создается.

http://www.cplusplus.com/reference/std/utility/pair/ http://www.cplusplus.com/reference/stl/map/find/

редактирования: скобки шаблона показываются на карте. тип ключа карты - ElementAccessor, значение - Element. Кроме того, для пары templating является int, int.

+0

Доступ к этим элементам является логарифмическим временем. Поэтому, если вы поместите 1 миллион элементов на карту, для доступа к вашим данным все равно не потребуется много операций. Не разыменовывающийся массив массивов постоянной продолжительности, а большая экономия пространства. –

+0

разметка исправлена. Существует (или раньше, я не проверял) раздражающую ошибку в SO, что отступ кода не работает в первой строке, следовательно, nbsp. –

+0

@steve спасибо! –

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