Two sum: Difference between revisions
Content added Content deleted
(added =={{header|Pascal}}==) |
m (→{{header|Pascal}}: checking High(A) was the most time consuming in function Check2SumUnSorted) |
||
Line 54: | Line 54: | ||
<pre>[1,3]</pre> |
<pre>[1,3]</pre> |
||
=={{header|Pascal}}== |
=={{header|Pascal}}== |
||
A little bit lengthy. Implemented an unsorted Version with quadratic runtime too and an extra test case that needs |
A little bit lengthy. Implemented an unsorted Version with quadratic runtime too and an extra test case with 60000 elements that needs 59999*59998/2 ~ 1.8 billion checks ( ~2 cpu-cycles/check ). |
||
<lang pascal> |
<lang pascal> |
||
program twosum; |
program twosum;{$IFDEF FPC}{$MODE DELPHI}{$ELSE}{$APPTYPE CONSOLE}{$ENDIF} |
||
{$IFDEF FPC}{$MODE DELPHI}{$ELSE}{$APPTYPE CONSOLE}{$ENDIF} |
|||
uses |
uses |
||
sysutils; |
sysutils; |
||
Line 68: | Line 66: | ||
tMyArray = array of NativeInt; |
tMyArray = array of NativeInt; |
||
const |
const |
||
// just a gag using unusual index limits |
|||
ConstArray :array[-17..-13] of NativeInt = (0, 2, 11, 19, 90); |
ConstArray :array[-17..-13] of NativeInt = (0, 2, 11, 19, 90); |
||
Line 73: | Line 72: | ||
sum:NativeInt; |
sum:NativeInt; |
||
var Sol:tSolRec):boolean; |
var Sol:tSolRec):boolean; |
||
//Check every possible sum A[ |
//Check every possible sum A[max] + A[max-1..0] |
||
//than A[max-1] + A[max-2..0] etc pp. |
|||
//quadratic runtime (max-1)*max/ 2 |
//quadratic runtime: maximal (max-1)*max/ 2 checks |
||
//High(A) always checked for dynamic array, even const |
|||
//therefore run High(A) to low(A) = is always 0 for dynamic array |
|||
var |
var |
||
i,j,tmpSum: NativeInt; |
i,j,tmpSum: NativeInt; |
||
Line 80: | Line 82: | ||
Sol.SolRecI:=0; |
Sol.SolRecI:=0; |
||
Sol.SolRecJ:=0; |
Sol.SolRecJ:=0; |
||
i := |
i := High(A); |
||
while i |
while i > low(A) do |
||
Begin |
Begin |
||
tmpSum := |
tmpSum := sum-a[i]; |
||
j := i |
j := i-1; |
||
while |
while j >= low(A) do |
||
begin |
begin |
||
if tmpSum = a[j] then |
if tmpSum = a[j] then |
||
Begin |
Begin |
||
Sol.SolRecI:= |
Sol.SolRecI:=j;Sol.SolRecJ:=i; |
||
result := true; |
result := true; |
||
EXIT; |
EXIT; |
||
end; |
end; |
||
dec(j); |
|||
end; |
end; |
||
dec(i); |
|||
end; |
end; |
||
result := false; |
result := false; |
||
Line 127: | Line 129: | ||
dec(j); |
dec(j); |
||
end; |
end; |
||
writeln(i:10,j:10); |
|||
result := false; |
result := false; |
||
end; |
end; |
||
Line 138: | Line 141: | ||
randomize; |
randomize; |
||
setlength(CheckArr,High(ConstArray)-Low(ConstArray)+1); |
setlength(CheckArr,High(ConstArray)-Low(ConstArray)+1); |
||
For i := |
For i := High(CheckArr) downto low(CheckArr) do |
||
CheckArr[i] := ConstArray[i+low(ConstArray)]; |
CheckArr[i] := ConstArray[i+low(ConstArray)]; |
||
Line 148: | Line 151: | ||
//now test a bigger sorted array.. |
//now test a bigger sorted array.. |
||
setlength(CheckArr, |
setlength(CheckArr,60000); |
||
For i := High(CheckArr) downto 0 do |
For i := High(CheckArr) downto 0 do |
||
CheckArr[i] := |
CheckArr[i] := i; |
||
CheckArr[ |
MySum := CheckArr[Low(CheckArr)]+CheckArr[Low(CheckArr)+1]; |
||
writeln(#13#10,'Now checking array of ',length(CheckArr), |
|||
CheckArr[High(CheckArr)] := 2; |
|||
' elements',#13#10); |
|||
⚫ | |||
MySum := 3; |
|||
⚫ | |||
IF Check2SumUnSorted(CheckArr,MySum,Sol) then |
IF Check2SumUnSorted(CheckArr,MySum,Sol) then |
||
writeln('[',Sol.SolRecI,',',Sol.SolRecJ,'] sum to ',MySum) |
writeln('[',Sol.SolRecI,',',Sol.SolRecJ,'] sum to ',MySum) |
||
Line 166: | Line 168: | ||
else |
else |
||
writeln('No solution found'); |
writeln('No solution found'); |
||
end. |
end.</lang> |
||
⚫ | |||
{{out}} |
{{out}} |
||
<pre>[1,3] sum to 21 |
<pre>[1,3] sum to 21 |
||
⚫ | |||
⚫ | |||
Now checking array of 60000 elements |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
=={{header|REXX}}== |
=={{header|REXX}}== |
||
<lang rexx>list=0 2 11 19 90 |
<lang rexx>list=0 2 11 19 90 |