Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.06.26;
Скачать: [xml.tar.bz2];

Вниз

разбить массив   Найти похожие ветки 

 
Scott Storch   (2011-03-21 17:37) [0]

чет туплю, помогите с алгоритмом:

есть массив IDs: array [0..8] of Integer = (1, 4, 5, 9, 11, 17, 18, 37, 53);

нужно разбить его на N частей, и как-то вернуть эти части;

к примеру N = 5, дожно получится как-то так:

1-я часть: IDs[0] IDs[5]
2-я часть: IDs[1] IDs[6]
3-я часть: IDs[2] IDs[7]
4-я часть: IDs[3] IDs[8]
5-я часть: IDs[4]


 
clickmaker ©   (2011-03-21 17:48) [1]

и что вызвало прям такие сложности?


 
Scott Storch   (2011-03-21 17:52) [2]

я написал свой вариант, вроде работает, но с точки срения оптимизация кажется мне уж очень хреновым, вот:


procedure slip(IDs: TList<Integer>; Count: Integer; Slipped: TObjectList);
var
 I, J, N: Integer;
begin
 if Count > IDs.Count then
   Count := IDs.Count;
 for I := 1 to Count do
   Slipped.Add(TList<Integer>.Create);
 N := 0;
 for I := 0 to IDs.Count - 1 do
 begin
   if N > Slipped.Count - 1 then
     N := 0;
   TList<Integer>(Slipped[N]).Add(IDs[I]);
   Inc(N);

 end;

end;

procedure TForm2.Button1Click(Sender: TObject);
var
 Slipped: TObjectList;
 IDs: TList<Integer>;
begin
 IDs := TList<Integer>.Create;
 try
   IDs.AddRange([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
     19]);
   Slipped := TObjectList.Create;
   try
     slip(IDs, 5, Slipped);
     ShowMessage(IntToStr(Slipped.Count));
   finally
     Slipped.Free;
   end;
 finally
   IDs.Free;
 end;

end;


 
oldman ©   (2011-03-21 18:11) [3]

массив из N элементов надо разбить на К частей?

А=1
делать вечно
 цикл В от 1 до К
   часть В=часть В + элемент массива(А+(В-1)*К)
   А=А+1
   если (А+(В-1)*К)>N выйти из делать вечно
 конец цикла
конец делать вечно


 
Scott Storch   (2011-03-21 18:30) [4]

что-то запулся в коде, можете набросать пример, на основе массива

IDs: array [0..8] of Integer = (1, 4, 5, 9, 11, 17, 18, 37, 53);


 
Leon-Z ©   (2011-03-21 18:51) [5]


type
 ppMas = ^tpMas;
 tpMas: [0..0] of Integer;
var
 IDs: array [0..8] of Integer = (1, 4, 5, 9, 11, 17, 18, 37, 53);
 pIDs: ppMas;
 i, n, m: Integer;
 nIDs: array [0..8] of Integer;
begin
 n := 5;
 m := 9 - n; // Количество элементов подмассива
 pIDs := @IDs[n]; // Адрес 5-го элемента
 for i := 0 to m - 1 do
   nIDs[i] := pIDs[i];
end;

Для nIDs[] можно конечно память выделять динамически,
причем столько сколько необходимо для размещения m - элементов.


 
Scott Storch   (2011-03-21 19:02) [6]

в nIDs[] в результате оказывается непонятно что.


 
oldman ©   (2011-03-21 19:09) [7]


> что-то запулся в коде, можете набросать пример, на основе
> массива
>
> IDs: array [0..8] of Integer = (1, 4, 5, 9, 11, 17, 18,
> 37, 53);


Приведи код, в котором запутался


 
Leon-Z ©   (2011-03-21 19:10) [8]

Sorry, в предидущем тексте несколько ошибок.
Вот проверенный вариант.
Работает в консоли.

program Project2;

{$APPTYPE CONSOLE}

uses
 SysUtils;

type
 ppIDs = ^ tpIDs;
 tpIDs = array [0..0] of Integer;

const
 IDs: array [0..8] of Integer = (1, 2, 5, 6, 2, 8, 7, 0, 3);

var
 pIDs: ppIDs;
 i, n, m: Integer;

begin
 n := 5;
 m := 9 - n;
 pIDs := @IDs[m];
 for i := 1 to m do
   Write(pIDs^[i], " ");
 Writeln;
 Readln;
end.


 
Leon-Z ©   (2011-03-21 19:13) [9]


 pIDs := @IDs[n];
 for i := 0 to m - 1 do Write(pIDs^[i], " ");

Вот окончательный вариант.


 
oldman ©   (2011-03-21 19:49) [10]


>  n := 5;
>  m := 9 - n;


:)))

типа m:=4 не катит?


 
oldman ©   (2011-03-21 19:52) [11]


> begin
>  n := 5;
>  m := 9 - n;
>  pIDs := @IDs[m];
>  for i := 1 to m do
>    Write(pIDs^[i], " ");
>  Writeln;
>  Readln;
> end.


а n:=5 на фига?


 
Leon-Z ©   (2011-03-21 20:03) [12]


> oldman ©   (21.03.11 19:52) [11]
> а n:=5 на фига?

Предпологается что n вводится пользователем.
n := 5 записанно для замены этой процедуры (там включена проверка
диапазона, вывод приглашения ввода и т. п.).
=> m := 4 - "не катит" :)


 
Sha ©   (2011-03-22 10:29) [13]

>Scott Storch   (21.03.11 17:52) [2]

побить можно так:

type
 TIds= array of integer;
 TParts= array of array of integer;

procedure IdsToParts(PartCount: integer; Ids: TIds; var Parts: Tparts);
var
 i, j, IdCount, SmallElemCount, FirstSmallPartNo, ElemCount: integer;
begin;
 IdCount:=Length(Ids);
 SmallElemCount:=IdCount div PartCount;
 FirstSmallPartNo:=IdCount - SmallElemCount * PartCount;
 SetLength(Parts,PartCount);
 for i:=0 to PartCount-1 do begin;
   ElemCount:=SmallElemCount + ord(i<FirstSmallPartNo);
   SetLength(Parts[i],ElemCount);
   for j:=0 to ElemCount-1 do begin
     Parts[i,j]:=IDs[i+j*PartCount];
     end;
   end;
 end;

procedure TForm1.Button2Click(Sender: TObject);
var
 Ids: TIds;
 Parts: Tparts;
 i, j, IdCount, PartCount: integer;
begin;
 IdCount:=9;
 PartCount:=5;
 SetLength(Ids, IdCount);
 Ids[0]:=1;
 Ids[1]:=4;
 Ids[2]:=5;
 Ids[3]:=9;
 Ids[4]:=11;
 Ids[5]:=17;
 Ids[6]:=18;
 Ids[7]:=37;
 Ids[8]:=53;
 IdsToParts(PartCount, Ids, Parts);
 Memo1.Lines.Clear;
 for i:=0 to PartCount-1 do
   for j:=0 to Length(Parts[i])-1 do
     Memo1.Lines.Add(Format("%d %d %d",[i,j,Parts[i,j]]));
 end;


Еще быстрее будет массив совсем не бить.
Ведь можно работать сразу с элементами Id, как это сделано в IdsToParts(),
правда так сама работа с частями замедлится.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.06.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
15-1299748624
laby
2011-03-10 12:17
2011.06.26
При вызове sp часики убрать


2-1300290965
lewka
2011-03-16 18:56
2011.06.26
Работа с текстом в MS Word


15-1299050447
Гость
2011-03-02 10:20
2011.06.26
Не против обсудить милицию-полицию и варианты обращения?


15-1300139550
antonn_win7
2011-03-15 00:52
2011.06.26
Фаервол Comodo


2-1300451637
umbra
2011-03-18 15:33
2011.06.26
компилятор не распознает класс





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский