Форум: "Начинающим";
Текущий архив: 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