如何判断一个数据集中连续N个结果有M个数据超过他们的平均数X ( 积分: 200 )

  • 主题发起人 主题发起人 jiangopen
  • 开始时间 开始时间
J

jiangopen

Unregistered / Unconfirmed
GUEST, unregistred user!
在dataset中有个double类型的字段uservalue。我打算写一个函数判断连续N个结果有M个数据超过他们的平均数X。现在平均数好办是已知的。 我把数据集装入到了数组里面。

var a:array of double;
begin
with dataset do
begin
first;
setlength(a,recordcount);
for i:=low(a) to high(a) do
begin
a:=fieldbyname('uservalue').asfloat;
next;
end
end;
end;

现在就把数据都装入了数组a 中

如果判断连续N个结果同时超过X就好办:
var i,k:integer;
begin
k:=0;
for i:=low(a) to high(a) do
begin
if (a>X) then
k:=k+1
else
k:=0;
end;
if k=N then showmessage('发现!');

end;

现在的问题是连续N个结果有M个超过X。这M个结果在N个结果中可以不是连续的,但是N个结果又是连续的。

我想了半天都没有写出合适的解决方法来。希望哪位热心人帮我一下,谢谢!
 
你可能搞複雜了,整理一下N,按你的需求操作
 
你的意思是不用数组就可以了?但是我想不出来新办法啊
 
哈哈,这简单啊,小小的逻辑问题啊.
把你的代码改一处地方,呵呵
var i,k:integer;
begin
k:=0;
for i:=low(a) to high(a) do
begin
if (a>X) then
k:=k+1
else
continue;//改变此处
end;
if k=N then showmessage('发现!');

end;
 
你写的代码是判断一个数据集中的uservalue累计有几个符合>X达到了N个数.
而现在的问题是判断一个数据集中是否连续N个结果中有M个达到了>X, N和M要体现出来啊.

比如现在数据集中有100多个行, 就是一个数据序列.我判断这个序列中有这样一个特征:连续7个结果中有3个是超过了平均数的. 这个7个数据在整个序列中是连续的(可以在序列中任何位置), 而且这7个数中有3个是超过平均数的,这个3个数据是在7个数据中的任何一个位置(不强调连续)


再想想啊,谢谢
这里面 N 就是 7 ,M就是 3
 
用队列来处理就没问题了:)

var
MyNums:array of Double;
AvgVal:Double;

{ 检查数组中是否满足N个连续数字中有M个大于给定值 }
function CheckBiggerNums(Nums:array of Double
AimVal: Double
N, M: Integer):Boolean;
var
i,c,d:Integer;
begin
Result:=true;
c:=0
//满足条件的数计数
d:=0
//初始队列长度
for i:=0 to High(Nums) do
begin
if Nums>AimVal then Inc(c)
//入队:符合条件就增加计数
if d=N then //检查队列长度
begin
if Nums[i-d]>AimVal then Dec(c)
//出队:符合条件就减小计数
end
else
Inc(d)
//队列增长
if c>=M then exit
//检查是否累积到M
end;
Result:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
begin
Randomize;
SetLength(MyNums,SpinEdit1.Value);
Memo1.Lines.Add('ValueCount: '+IntToStr(SpinEdit1.Value));
AvgVal:=0;
for i:=0 to High(MyNums) do
begin
MyNums:=Random(1000)*0.1;
Memo1.Lines.Add(FloatToStr(MyNums));
AvgVal:=AvgVal+MyNums;
end;
AvgVal:=AvgVal/SpinEdit1.Value;
Memo1.Lines.Add('Avg: '+FloatToStr(AvgVal));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Lines.Add(Format('CheckBiggerNums N=%d M=%d',[SpinEdit2.Value,SpinEdit3.Value]));
if CheckBiggerNums(MyNums,AvgVal,SpinEdit2.Value,SpinEdit3.Value) then
Memo1.Lines.Add('OK!')
else
Memo1.Lines.Add('Failed!');
end;

ValueCount: 8
48.2
69.4
61
32.3
2
71.1
20.1
8.8
Avg: 39.1125
CheckBiggerNums N=4 M=3
OK!
CheckBiggerNums N=4 M=4
Failed!
ValueCount: 8
55.6
92.5
85.9
21.8
92.7
58.1
31.6
22.5
Avg: 57.5875
CheckBiggerNums N=4 M=4
Failed!
CheckBiggerNums N=4 M=3
OK!
CheckBiggerNums N=5 M=4
OK!
CheckBiggerNums N=6 M=5
Failed!
CheckBiggerNums N=6 M=4
OK!
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
763
import
I
I
回复
0
查看
687
import
I
后退
顶部