Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.06.26;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
15-1299765057
Leon-Z
2011-03-10 16:50
2011.06.26
Алгоритмы.


15-1299822781
И. Павел
2011-03-11 08:53
2011.06.26
БД Access не открывается, хотя JET 4.0 установлен


15-1299302188
И. Павел
2011-03-05 08:16
2011.06.26
С 8 марта!


15-1299059469
George
2011-03-02 12:51
2011.06.26
Rave Reports и PDF


15-1299072313
Leon-Z
2011-03-02 16:25
2011.06.26
Создание ИИ.