大数组移动数据的问题

bitcom 2007-02-14 04:18:31
现在有个大数组有4000个元素,想每次新加200个元素, 新加之前要把前边的200个删除,后边的 3800移动到前边,再添加新的200个元素,我现在用的是静态数组,向这样的大数组同时有10个, 有没有更快的办法啊
...全文
267 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐老猫 2007-02-18
  • 打赏
  • 举报
回复
循环队列、FIFO队列,或者用一个整型数标志数组起点。
bitcom 2007-02-15
  • 打赏
  • 举报
回复
不是固定长度,程序中的Len是变的
ahjoe 2007-02-15
  • 打赏
  • 举报
回复
如果每次固定有200个元素。将200个元素当作一个整体。数组中只放指针,指针指向200个元素的数组。
ahjoe 2007-02-15
  • 打赏
  • 举报
回复
如果需要最高效率,用循环队列。
bitcom 2007-02-15
  • 打赏
  • 举报
回复
我得程序是这样写的
var
i:integer;
voltBufBuf:array[0..16383] of double;
S1,S2,S3,S4,S5,S6,S7,S8:array[0..2047] of double;

ss1,ss2,ss3,ss4,ss5,ss6,ss7,ss8,fftyarry:array[0..4095] of double;

//LEN<小于2048

把大数组的数据分配到8个小的数组中
for i:=0 to LEN-1 do S1[i]:=voltBuf[i];
for i:=LEN to 2*LEN-1 do S2[i-LEN]:=voltBuf[i];
for i:=2*LEN to 3*LEN-1 do S3[i-2*LEN]:=voltBuf[i];
for i:=3*LEN to 4*LEN-1 do S4[i-3*LEN]:=voltBuf[i];
for i:=4*LEN to 5*LEN-1 do S5[i-4*LEN]:=voltBuf[i];
for i:=5*LEN to 6*LEN-1 do S6[i-5*LEN]:=voltBuf[i];
for i:=6*LEN to 7*LEN-1 do S7[i-6*LEN]:=voltBuf[i];
for i:=7*LEN to 8*LEN-1 do S8[i-7*LEN]:=voltBuf[i];
//分析S1...S8
大家给个意见

ahjoe 2007-02-15
  • 打赏
  • 举报
回复
那就用简单的循环队列就行了。
lihuasoft 2007-02-14
  • 打赏
  • 举报
回复
实际上简单类型的数组,4000个元素,做楼主要求的赋值,速度很快的,使用者根本觉察不到速度差异。

比如:
var
A : array[0..3999] of integer;
I : integer;
begin
//.....
for I := 0 to 3799 do
A[I] := A[I+200];
showmessage('ok');
end;
这样也不慢。

如果数据量非常非常大,还可以参考记录类型。
mastersky 2007-02-14
  • 打赏
  • 举报
回复
不用指针.每个数组只用1个变量记录头就可以了.比如head
一般访问第0个元素都是A[0],第I个元素就是A[I].
现在第0个元素就是A[head],第I个元素就是A[I+head]
如果I+head>3999,则第I个元素就是A[I+head-4000]
代码大致如下:
X:=I+head;
if X>3999 then
X:=X-4000;
A[X]就是第I个元素了.
mastersky 2007-02-14
  • 打赏
  • 举报
回复
浪的思路和我想的差不多 ,不过如何实现 使用指针吗?
_______________________________________________
不用指针.每个数组只用1个变量记录头就可以了.比如head
一般访问第一个数组都是A[0],第I个数组就是A[I].
现在第一个数组就是A[head],第I个数组就是A[I+head]
如果I+head>3999,则第I个数组就是A[I+head-4000]
代码大致如下:
X:=I+head;
if X>3999 then
X:=X-4000;
A[X]就是第I个元素了.
bitcom 2007-02-14
  • 打赏
  • 举报
回复
我先用move 试试
bitcom 2007-02-14
  • 打赏
  • 举报
回复
浪的思路和我想的差不多 ,不过如何实现 使用指针吗?
lihuasoft 2007-02-14
  • 打赏
  • 举报
回复
前面我的代码忽视了一个细节:数据长度。move是以字节为单位进行复制的,所以,如果是Integer类型(4字节),就要改一下我的代码:

var
A : array[0..3999] of integer;
begin
//......
move(A[200], A[0], 3800*4);//这就是把后200~3999元素复制给0~3799元素。
~~~~~~~
//......给3800~3999元素赋新值。可以参考move函数,用一个200元素的数组move到A[3800]
end;

你可以根据你的元素类型长度,灵活运用
mastersky 2007-02-14
  • 打赏
  • 举报
回复
给你个思路吧.
如果你删了移,那样一次得操作4000个元素.但是你只需要做个头尾的标记,那样就只需要操作200个元素.性能提高了20倍.
lihuasoft 2007-02-14
  • 打赏
  • 举报
回复
var
A : array[0..3999] of integer;
begin
//......
move(A[200], A[0], 3800);//这就是把后200~3999元素复制给0~3799元素。
//......给3800~3999元素赋新值。可以参考move函数,用一个200元素的数组move到A[3800]
end;
lihuasoft 2007-02-14
  • 打赏
  • 举报
回复
用move函数

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧