Привет.
Внезапно понадобились ассоциативные массивы в паскале ( Free Pascal ).
Надо было из 10^5 чисел быстро находить количество повторов определенного числа. Это нужно делать по ходу ввода этих чисел.
Я хотел создать массив, где индекс будет числом, а значение элемента - количеством повторов этого числа.
Только вот проблема: число может быть от 1 до 10^13.
То есть нужен массив на 10^13 элементов.
Так как паскаль при создании массива забивает его нулями то, ясное дело, ему не хватит памяти создать такой массив.
Ладно, думаю я, в паскале же есть динамические массивы!
Оказывается, что вся их динамичность заключается в том, что я могу по ходу дела изменять длину массива!
В моем понимании, динамический массив должен делать следующее:
И промежуточных элементов быть не должно. Но это же паскаль.
Как бы я сделал это на Javascript/ActionScript 3.0?
Хорошо. Хочу такое же на паскале. Гуглим, узнаем, что в ECMAScript ( основа Javascript и ActionScript 3.0 ) объекты - это ассоциативные массивы. В этой же статье есть пример на Delphi. Руководствуясь правилом: что есть в Delphi, то есть и в Pascal, пишем примерчик:
Единственное, что не есть хорошо - мы можем в качестве индекса и значения использовать только строку. Но мы можем в качестве значения хранить индекс массива, в котором мы будем хранить объекты или что-нибудь еще. Конечно, теперь индекс может быть любым.
То есть
Внезапно понадобились ассоциативные массивы в паскале ( Free Pascal ).
Надо было из 10^5 чисел быстро находить количество повторов определенного числа. Это нужно делать по ходу ввода этих чисел.
Я хотел создать массив, где индекс будет числом, а значение элемента - количеством повторов этого числа.
Только вот проблема: число может быть от 1 до 10^13.
То есть нужен массив на 10^13 элементов.
Так как паскаль при создании массива забивает его нулями то, ясное дело, ему не хватит памяти создать такой массив.
Ладно, думаю я, в паскале же есть динамические массивы!
Оказывается, что вся их динамичность заключается в том, что я могу по ходу дела изменять длину массива!
В моем понимании, динамический массив должен делать следующее:
array[ 0 ] = 1; array[ 1000000 ] = 2;
И промежуточных элементов быть не должно. Но это же паскаль.
Как бы я сделал это на Javascript/ActionScript 3.0?
var list = {}; list[ 10000000000000 ] = 1;
Хорошо. Хочу такое же на паскале. Гуглим, узнаем, что в ECMAScript ( основа Javascript и ActionScript 3.0 ) объекты - это ассоциативные массивы. В этой же статье есть пример на Delphi. Руководствуясь правилом: что есть в Delphi, то есть и в Pascal, пишем примерчик:
{$MODE OBJFPC} uses Classes, SysUtils; var list : TStringList; begin list := TStringList.Create; list.CommaText := '123=42, a=45'; writeln( list.values[ 'a' ] ); // 45 end.
Единственное, что не есть хорошо - мы можем в качестве индекса и значения использовать только строку. Но мы можем в качестве значения хранить индекс массива, в котором мы будем хранить объекты или что-нибудь еще. Конечно, теперь индекс может быть любым.
То есть
a[ '12315315641651' ] = '26'; b[ 26 ] = myAwesomeObject;
Комментариев нет:
Отправить комментарий