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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2008, 03:27   #1
MusicMan
Пользователь
 
Аватар для MusicMan
 
Регистрация: 19.04.2008
Сообщений: 66
Смущение

Привет всем! Есть у меня тут такое дело. Столкнулся с проблемой :
Чё есть -
1)Дан динамический массив из целых чисел с количеством "n";
Код:
type 
  TArray = array of integer;
  PArray = ^TArray;     
...
var
  ArrayOfIndex : PArray;
2)В этом массиве должны храниться индексы, на что-либо
указывающие...
Я сделал "перемешивание" не используя дополнительных массивов
в целях экономии памяти(Пр : 1024 элементов по 4 байта и дублирующий массив, как вспомогательная переменная - многовато).

-алгоритм(функция)

Код:
function Suffle(AoI : PArray) : PArray;
 var 
  i,RIndex : integer;
  buffer : integer;
 begin
  if  AoI = nil then exit;
  randomize; 
   for i := 0 to Length(AoI^)-1 do
     begin
      repeat
       random(RIndex,Length(AoI^)-1)
      until RIndex <> i; 
      buffer := AoI^[i]; 
      AoI^[i] := AoI[RIndex];
      AoI^[RIndex] := buffer
     end;
 end;
Что нужно -
По возможности более оптимально написать код (оптимизировать).
Дело в том что этот алгоритм должен очень быстро выдавать результ.

ЗЫ : Писал и с константовыми массивами, но в итоге пришёл к
динамическим т.к. они более гибкие в использовании.

Впитаю любые идеи...
Нет таких проблем, которых мы не можем себе создать

Последний раз редактировалось AlDelta; 26.04.2008 в 12:15. Причина: [CODE]
MusicMan вне форума Ответить с цитированием
Старый 26.04.2008, 10:14   #2
МаксимNEWProgramm
Пользователь
 
Аватар для МаксимNEWProgramm
 
Регистрация: 04.04.2008
Сообщений: 57
По умолчанию

пргогнал твою прогу Вроде всё работает ,да и убрать особо нечего
попробуй с Константой.
Программированине-это не очередная пара, а искуство показать себя!!!
МаксимNEWProgramm вне форума Ответить с цитированием
Старый 26.04.2008, 10:38   #3
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Смотря что считать перемешиванием. Если меняем два элемента, это достаточное перемешивание ?

- Можно перемешивать сериями. Как мы тасуем колоду карт. Random'ом определяем начало серии, длину, с чем поменять и меняем сразу несколько элементов. После нескольких таких действий массив будет перемешан.

- Вариант оптимизации Вашего кода. Берем элемент temp := A[Random]. Выбираем случаный элемент. Помещаем его в предыдущий (который мы запомнили в temp), новый элемент теперь свободен. В него помещаем другой. После цикла в последнюю "дырку" помещаем temp.
alexBlack вне форума Ответить с цитированием
Старый 26.04.2008, 21:01   #4
MusicMan
Пользователь
 
Аватар для MusicMan
 
Регистрация: 19.04.2008
Сообщений: 66
Смущение

Цитата:
Сообщение от МаксимNEWProgramm Посмотреть сообщение
пргогнал твою прогу Вроде всё работает ,да и убрать особо нечего
попробуй с Константой.
Дело в том что реально количество элементов будет постоянно
меняться в пределах от [0..1024] да может даже и больше.
Т.Е. константа это максимум, а это уже плохо(приходится "двигать" лимит... Двинешь в лево - мало ну т.д.). И в конце массива
будет постоянно оставаться "мусор", с которым придёться бороться.

Пробовал, не катит. Проблем, на самом деле, становиться только больше.
Нет таких проблем, которых мы не можем себе создать
MusicMan вне форума Ответить с цитированием
Старый 26.04.2008, 21:06   #5
MusicMan
Пользователь
 
Аватар для MusicMan
 
Регистрация: 19.04.2008
Сообщений: 66
Смех

Цитата:
Сообщение от alexBlack Посмотреть сообщение
Смотря что считать перемешиванием. Если меняем два элемента, это достаточное перемешивание ?
А выходит вкусный винигрет

Цитата:
- Можно перемешивать сериями. Как мы тасуем колоду карт. Random'ом определяем начало серии, длину, с чем поменять и меняем сразу несколько элементов. После нескольких таких действий массив будет перемешан.

- Вариант оптимизации Вашего кода. Берем элемент temp := A[Random]. Выбираем случаный элемент. Помещаем его в предыдущий (который мы запомнили в temp), новый элемент теперь свободен. В него помещаем другой. После цикла в последнюю "дырку" помещаем temp.
Довольно интересная идея! Я учту! Спасибо большое! Вот
Нет таких проблем, которых мы не можем себе создать
MusicMan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) Dorvir Microsoft Office Excel 2 28.03.2008 10:03
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49