Szybki algorytm porównywająco-zliczający

0

Przypuśćmy, że mam do porównania takie coś:

Wzornik:
01 22 33 44 54 98 99

Tablica liczb:

01 98 99 | 3
22 33 31 | 2
00 23 88 | 0
51 52 53 | 0
{...) - bardzo duża ilość

Chodzi ażeby porównać tablicę liczb z wzornikiem.
Po podsumowaniu wynik 3=1, 2 = 1, 0 = 2.

PYTANIE BRZMI.

  1. Czy istnieją gotowe algorytmy do zliczania tego typu (bo jak używam pętli for z copy i pos to pętla zwalnia).
  2. Jak powinienem się zabrać do porównywania wzornika z tablicą liczb ?
1
type TValue=1..99;
type TValueSet=set of TValue;
var Pattern,Row,Cross:TValueSet;
var Count:Integer;
var I:TValue;

begin
  Pattern:=[01,22,33,44,54,98,99];
  Row:=[22,33,31];
  Cross:=Row * Pattern;
  Count:=0;
  for I:=Low(Value) to High(Value) do
  begin
    if I in Cross then Inc(Count);
  end;
  WriteLn(Count);
end.
0

Mam do Ciebie kolego pytanie jak podstawić do Pattern i Row stringa ?

0

@Bruno(M) - jak chcesz podstawić do Pattern i Row Stringa, skoro obie te zmienne są zbiorem liczb typu TValue?

Bezpośrednio nie bardzo, jedynie podzielić na znaki i pobrać kod ASCII i wtedy wpisać do zbioru.

0
type TValue=1..99;
type TValueSet=set of TValue;

var Pattern:TValueSet;
var Count,P,L:Integer;
var PatternStr,RowStr:String;
begin
  PatternStr:='01 22 33 44 54 98 99';
  RowStr:='22 33 31';
  Pattern:=[];
  L:=Length(PatternStr);
  P:=1;
  while P<L do
  begin
    Include(Pattern,StrToInt(Copy(PatternStr,P,2)));
    Inc(P,3);
  end;
  Count:=0;
  L:=Length(RowStr);
  P:=1;
  while P<L do
  begin
    if StrToInt(Copy(RowStr,P,2)) in Pattern then Inc(Count);
    Inc(P,3);
  end;
  WriteLn(Count);
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1