高分求一个数值范围判断的算法(200分)

  • 主题发起人 主题发起人 Sinker
  • 开始时间 开始时间
S

Sinker

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟数学以前没学好,现有一个问题要请教一下:

有一组不重复的数值范围记录,每个记录包含一个起始值和一个终止值(也就是类似10~20、25~30这样的记录),记录已事先按起始值排序好了。现在要求任意指定一个数值范围,在该组数值范围记录中查找是否有重复的数值范围出现,并要得出重复部分的数值范围。

举个具体一点的例子:
比如有下面这样一组数值范围(全部以正整数来计算)
10~20
25~30
35~40
42~50
(这4组数值记录已事先按起始值排序好了且互相之间无重复部分)
当用户输入任意一个新的数值范围时,需要在上述4组数值范围中查找重复的数值
比如用户输入1~5,此数值范围在上述4组记录中并未出现,所以可以通过
如果用户输入15~28,由于15~20以及25~28已经出现在上诉4组记录中,所以不能通过,并且需要返回重复的数值范围(即返回15~20以及25~28)

这样的问题,200分求一个算法,急用!谢谢!
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function checkPt(pt: tpoint
x, y: integer): boolean;
begin
result := false;
if x > pt.y then
exit;
if y < pt.x then
exit;

result := true;
end;

function checkPtlist(list: array of tpoint
x, y: integer
var boollist: array of boolean): boolean;
var
i: integer;
begin
result := false;
for i := 0 to high(list) do
begin
boollist := checkPt(list, x, y);
if boollist then
result := true;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
list: array of tpoint;
boollist: array of boolean;
i: integer;
s: string;
begin

setlength(list, 4);
setlength(boollist, 4);

list[0] := Point(10, 20);
list[1] := Point(25, 30);
list[2] := Point(35, 40);
list[3] := Point(42, 50);
if not checkPtlist(list, 1, 5, boollist) then
begin
showmessage('未出现');
end;

if checkPtlist(list, 15, 28, boollist) then
begin
s := '';
for i := 0 to high(list) do
if boollist then
begin
s := s + #13 + format('%d~%d', [list.x, list.y]);
end;
showmessage(s);
end;

setlength(boollist, 0);
setlength(list, 0);
end;

end.
 
学习一下。
 
谢谢hfghfghfg[:)]
不过你的代码最终只能提示用户输入的数值在哪几组范围中出现,而无法直接告诉用户具体的重复的数值范围。
我需要的算法是最终能得到类似“15~20和25~28”这样的具体结果。
不知道我的意思表达清楚没有……
 
那个 你自己改改 就可以拉
很简单啊
你用 min max 一下就可以啊
 
s := s + #13 + format('%d~%d', [max(list.x, 15), min(list.y, 28)]);
 
我想要一个更高一点效率的算法,因为实际应用的时候不止是4组数值范围,而是随时间有可能累积到成千上万组,如果每一次判断都要遍历所有记录的话到后面会越来越慢,而且这些范围记录是不能合并的…
 
可以优化
不过 你的 list 如果 几百万 应该 不需要优化
优化 很简单 你
但是 前提是 list 一定要顺序
例如 你可以在
for i := 0 to high(list) do
begin
boollist := checkPt(list, x, y);
if boollist then
result := true;
end;
里 判断 如果 x>list.y 了你可以 直接
break;

还有 很多 优化的 方法 你可以自己想
 
可以考虑放到数据库里用SQL语句查询判断,要设计好
 
后退
顶部