Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2008, 20:04   #11
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Все алгоритмы по своему хороши, с делением пополам интересный. В моем случае лучше подойдет массив boolean покрывающий весь диапазон значений, с ним наверное быстрее всего будет, а памяти хватит
Еще раз всем спасибо!
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 06.02.2008, 20:40   #12
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Вы только с boolean не торопитесь, он ведь 32 бита длиной (не помню точно, как в дельфи), лучше бинарный массив завести.
B_N вне форума Ответить с цитированием
Старый 06.02.2008, 20:58   #13
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Оно то может и лучше, но это выходит за рамки моих знаний
boolean = 1 байт, умножаем на 16 млн. получаем ~16МБ, пустяки какие
тем более он будет временный
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 07.02.2008, 06:00   #14
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
2Андрей, не совсем понял принцип, что за сумма S? После нескольких сложений произойдет переполнение, или она не для этого? Можно без кода на словах.
Виноват, неправильно обозвал. S - это счетчик неповторяющихся значений.

Разве не вы написали в условии что вам нужно узнать количество уникальных значений? вот она и прибавляет единичку если значение уникальное.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Старый 07.02.2008, 14:30   #15
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
2Андрей, не совсем понял принцип, ...
Вот оформил свои мысли в виде кода и отказался от промежуточного массива. На примере матрицы 3х3:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var i, k, StartI, kol: cardinal;
    A1: array[0..2,0..2] of char; {матрица 3х3}
    L1: array[0..2,0..2] of TLabel; {массив лейблов для отражения матрицы 3х3}
    A2: array[0..8] of char; {одномерный массив для работы}
    CurVal, OldVal: char;
    Dubl: boolean;
begin
 L1[0,0]:=Label1;
 L1[0,1]:=Label2;
 L1[0,2]:=Label3;
 L1[1,0]:=Label4;
 L1[1,1]:=Label5;
 L1[1,2]:=Label6;
 L1[2,0]:=Label7;
 L1[2,1]:=Label8;
 L1[2,2]:=Label9;

{Загружаю значения в матрицу} 
A1[0,0]:='1';
 L1[0,0].Caption:=A1[0,0];
 A1[0,1]:='2';
 L1[0,1].Caption:=A1[0,1];
 A1[0,2]:='5';
 L1[0,2].Caption:=A1[0,2];
 A1[1,0]:='1';
 L1[1,0].Caption:=A1[1,0];
 A1[1,1]:='6';
 L1[1,1].Caption:=A1[1,1];
 A1[1,2]:='9';
 L1[1,2].Caption:=A1[1,2];
 A1[2,0]:='1';
 L1[2,0].Caption:=A1[2,0];
 A1[2,1]:='1';
 L1[2,1].Caption:=A1[2,1];
 A1[2,2]:='1';
 L1[2,2].Caption:=A1[2,2];

{перегоняю матрицу в одномерный массив 
потому как с ним код проще и понятней} 
StartI:=0;
 for i:=0 to 2 do
  for k:=0 to 2 do
  begin
   a2[StartI]:=a1[i,k];
   StartI:=StartI+1;
  end;

 Kol:=0; {обнуляю количество уникальных значений}
 StartI:=0; {начало обработки массива}
 Dubl:=false; {указатель повторяемости записи}

 while StartI<=8 do {гоняю одномерный массив до тех пор пока стартовая запись не сравняется с его размером}
 begin
 CurVal:=a2[StartI]; {присваиваю значение начальной точки}
 ;
 for i:=StartI+1 to 8 do {прогоняю массив, начиная со стартовой точки+1}
 begin
  if a2[i]=CurVal {сравниваю текущее значение со значением начальной точки}
  then 
  begin 
   Dubl:=True; {запись не уникальна}
   StartI:=StartI+1; {сдвигаю начальную точку на одно значение}
   OldVal:=a2[StartI]; {копирую значение из новой начальной точки в переменную}
   a2[StartI]:=CurVal; {записываю сравниваемое значение в новую начальную точку}
   a2[i]:=OldVal; {присваиваю прежнее значение начальной точки в текущему значению массива}
  end;
 end;
 ;
 if not Dubl then Kol:=Kol+1; {если запись уникальна увеличиваю кол-во}
 Dubl:=false;
 StartI:=StartI+1; {сдвигаю начальную точку на один элемент вперед}
 end;
 ShowMessage('Количество уникальных записей: '+IntToStr(Kol));

{а здесь вывожу одномерный массив в лебелы чтобы увидеть результаты работы программы} 
StartI:=0;
 for i:=0 to 2 do
  for k:=0 to 2 do
  begin
   L1[i,k].Caption:=a2[StartI];
   StartI:=StartI+1;
  end;
end;
Думаю подобное можно было бы замутить и непосредственно на самой матрице без перегонки в одномерный массив, но уж больно код мудреный получается.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация кода [Smarik] Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 20.08.2008 15:00
Оптимизация WEB SirJay Свободное общение 0 09.05.2008 00:26
Оптимизация Terran Общие вопросы Delphi 3 03.05.2008 19:03
Оптимизация программ Jeni Свободное общение 17 14.06.2007 18:45