-
1. Data: 2009-05-29 05:54:27
Temat: Przekrój przedziałów
Od: "Wojciech \"Spook\" Sura" <w...@s...medi.com.pl>
Witam!
W jaki sposób najszybciej (włączając w to assemblera) znaleźć przekrój dwóch
przedziałów?
Formalnie: Niech [A, B] i [C, D] będą dwoma domkniętymi przedziałami takimi,
że A, B, C, D : integer. Szukany jest największy przedział [E, F] taki, że
[E, F] zawiera się zarówno w [A, B] jak i w [C, D].
Zapis przedziałów może być dowolny, ale możemy przyjąć, że jest to:
type TRange = record
Left, Right : integer;
end;
Mój pomysł jest taki:
function Intersection(RangeA, RangeB : TRange; ResultIntersection : TRange)
: boolean;
begin
ResultIntersection.left:=max(RangeA.left, RangeB.left);
ResultIntersection.right:=min(RangeA.right, RangeB.right);
result:=(ResultIntersection.left<=ResultIntersection
.right);
end;
Czy da się szybciej?
Pozdrawiam -- Spook.
-
2. Data: 2009-05-29 13:58:23
Temat: Re: Przekrój przedziałów
Od: Michoo <m...@v...pl>
Wojciech "Spook" Sura pisze:
> Witam!
>
> W jaki sposób najszybciej (włączając w to assemblera) znaleźć przekrój dwóch
> przedziałów?
>
> Formalnie: Niech [A, B] i [C, D] będą dwoma domkniętymi przedziałami takimi,
> że A, B, C, D : integer. Szukany jest największy przedział [E, F] taki, że
> [E, F] zawiera się zarówno w [A, B] jak i w [C, D].
>
> Zapis przedziałów może być dowolny, ale możemy przyjąć, że jest to:
>
> type TRange = record
> Left, Right : integer;
> end;
>
> Mój pomysł jest taki:
>
> function Intersection(RangeA, RangeB : TRange; ResultIntersection : TRange)
> : boolean;
>
> begin
> ResultIntersection.left:=max(RangeA.left, RangeB.left);
> ResultIntersection.right:=min(RangeA.right, RangeB.right);
> result:=(ResultIntersection.left<=ResultIntersection
.right);
> end;
>
> Czy da się szybciej?
Asembler raczej nie da Ci tu specjalnej wydajności. Jedno co może
_odrobinę_ pomóc to pozbycie się wywołania min/max na rzecz if-else. I
ewentualnie pozbycie się wywołania samego Intersection (delphi obsługuje
funkcje inline albo makra?).
--
Pozdrawiam
Michoo