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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2008, 21:30   #1
_Alise_
 
Аватар для _Alise_
 
Регистрация: 03.06.2008
Сообщений: 6
По умолчанию Помогите с массивами в Делфи

Дан одномерный массив. Найти подпоследоватльность наибольшей длины, которая повторятся в массиве ровно N раз.
_Alise_ вне форума Ответить с цитированием
Старый 03.06.2008, 21:48   #2
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

а массив чего дан?
Упс...
L_M вне форума Ответить с цитированием
Старый 03.06.2008, 21:52   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Не вопрос, а армянская загадка. Пять слов по человечески связать не могут.
puporev вне форума Ответить с цитированием
Старый 04.06.2008, 13:02   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, не знаю, не знаю... а мне понравилась задачка... ;-)
По крайней мере, хоть не банальщина какая-то типа поиска максимума/минимума...
Я, например, вот так сходу, даже алгоритм решения не вижу...

Цитата:
Сообщение от L_M
а массив чего дан?
а по сути, какая разница? Ну, например, символов... или целых чисел...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.06.2008, 14:04   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Алгоритм ясен - перебор, только сложноват немного. Условие тоже не из простых, еще понять надо )
Я понял вроде так, к примеру если массив такой:
012012012
N = 3

Решение: ровно N раз повторяются подпоследовательности 01, 12, и 012. Наибольшей длины - 012. Я правильно понял задание или нет?

Вообще задача из области фантастики, где такое может понадобиться? Абстракция в чистом виде. Что, что, а мозги морочить в институтах умеют.
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 вне форума Ответить с цитированием
Старый 04.06.2008, 22:48   #6
_Alise_
 
Аватар для _Alise_
 
Регистрация: 03.06.2008
Сообщений: 6
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
Я правильно понял задание или нет?
Правильно. Вы мне поможете?
_Alise_ вне форума Ответить с цитированием
Старый 05.06.2008, 14:42   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Что вы сейчас изучаете, не рекурсию?

Кстати тему такую же вторую создавать не надо было. От этого вы ответ быстрее не получите.

Подпоследовательностью считается только такая 012345? или 325041 тоже подпоследовательность?
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; 05.06.2008 в 14:44.
mutabor вне форума Ответить с цитированием
Старый 05.06.2008, 16:25   #8
PAWLO1993
Пользователь
 
Регистрация: 24.03.2008
Сообщений: 31
По умолчанию

Мне нужна похожая задачка, толька у меня нужно найти N, а последоватольность дано. Например:
1 1 3 2 1 1 3 2, тогда N=4
1 1 3 2 1 1 3 51, тогда N=8.
PAWLO1993 вне форума Ответить с цитированием
Старый 05.06.2008, 17:26   #9
master_root
Пользователь
 
Регистрация: 18.05.2008
Сообщений: 30
По умолчанию

Код просто перебирает все возможные последовательности, которые повторяются N раз и выбирает среди них самую длиную:
Код:
{функция возрощает строку, которая содержит самую длиную последовательность,
 которая повторяется в массиве N раз}
function GetMaxSeq(arr: array of integer; N: integer): string;
type
  RmaxM = Record
    index: integer;// i-индекс, с которого начинается в массиве очередная последовательность
    length: integer;// j-длина последовательности
  end;
var
  maxM: RmaxM;
  i,j,z,j1,z1: integer;
  M: integer;//число повторений последовательности
  eq: boolean;
  tmp_result: string;//строка,в которой формируется результат функции
begin
{инициализация переменных - присваивание начальных значений}
  maxM.index:=0;
  maxM.length:=1;
  tmp_result:='';
  eq:=false;
  for i := 1 to Length(arr) do//перебор всех возможных длин в массиве
  begin
    M:=1;
    j:=0;
    {поиск}
    repeat// j изменение отсчётного индекса посделовательности
      z:=0;
      repeat//z изменение индекса последовательности с которой сравнивается текущая последовательность
        if z<>j then//если индексы не совпадают то сравниваем соответствующие последовательности
        begin
          z1:=z;
          for j1 := j to i do//перебор элементов в последовательностях, которые сравниваются
          begin
            if arr[j1]=arr[z1] then//сравнение элементов в последовательностях
            begin
              eq:=true;
              z1:=z1+1;
            end
            else
            begin
              eq:=false;
              z1:=z1+1;
              break;
            end;
          end;
          if eq = true then M:=M+1;//если все элементы совпали в последовательностях, то увеличиваем счётчик вхождения
        end
        else
        z:=z+1;
        until z=Length(arr)-i;
        if M=N then//если счётчик вхождений совпадает с нужным числом вхождений, то
        begin
          if maxM.length<i then//и если длина последовательности больше текущей, то
          begin
            //записываем параметры новой более длинной последовательности
            maxM.length:=i;
            maxM.index:=j;
          end;
        end;
    until j=Length(arr)-i;
  end;
{формируем результат в виде строки, которая содержит элементы
самой длиной последовательности}
  for i:=maxM.index to maxM.index+maxM.length do
    tmp_result:=tmp_result+inttostr(arr[i]);
  result:=tmp_result;//вывод результата
end;
master_root вне форума Ответить с цитированием
Старый 05.06.2008, 21:47   #10
master_root
Пользователь
 
Регистрация: 18.05.2008
Сообщений: 30
По умолчанию

!!!функция разрабатывалась в теории. При прогоне в BDS оказалось что,во время выполнения следующего кода:
Код:
  if arr[j1]=arr[z1] then//сравнение элементов в последовательностях  
             begin  
               eq:=true;  
               z1:=z1+1;  
             end
переменная z1 деинициализируется, то есть теряет своё значение будто его и не определяли.
master_root вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с массивами пожалуйста neomaximus Помощь студентам 5 08.07.2008 17:48
помогите с массивами Ibmsystem Помощь студентам 1 21.04.2008 08:10
Помогите с массивами Юль_кА Паскаль, Turbo Pascal, PascalABC.NET 2 10.04.2008 08:39
Помогите новичку с массивами alexei Общие вопросы Delphi 9 11.09.2007 22:19