function Sequence = GFD4(Segments) % MARCHE ENCORE ?
%no changes here
[nSegs, lSegs] = size(Segments);
[SortedHash Order] = sort(Segments * randn(lSegs,1)) ;
Segments = Segments(Order(diff(cat(1,SortedHash,0)) ~= 0), :);
[nSegs, lSegs] = size(Segments);
theSegments = cell(nSegs, 1);
theSegs = 1:nSegs;
for index = theSegs,
theSegments{index} = Segments(index, :);
end
copySegments = theSegments;
matchLength = lSegs-1;
while matchLength > 0
Segments(:, 1) = [];
for leftSeg = theSegs
Match = find(strncmp(Segments(leftSeg, :), copySegments, matchLength));
if Match
Select = Match(1);
rightSeg = theSegs(Select);
if rightSeg == leftSeg
if length(Match) > 1 % Rare case
temp = Match(Match ~= Select);
Select = temp(1);
rightSeg = theSegs(Select);
theSegments{rightSeg} = cat(2,theSegments{leftSeg}, theSegments{rightSeg}(1+matchLength:end));
i = find(theSegs == leftSeg);
theSegs(i) = [];
if length(theSegs) == 1
Sequence = theSegments{theSegs};
return;
end
copySegments(Select) = copySegments(i);
copySegments(i) = [];
end
else
theSegments{rightSeg} = cat(2,theSegments{leftSeg}, theSegments{rightSeg}(1+matchLength:end));
i = find(theSegs == leftSeg);
theSegs(i) = [];
if length(theSegs) == 1
Sequence = theSegments{theSegs};
return;
end
copySegments(Select) = copySegments(i);
copySegments(i) = [];
end
end
end
matchLength = matchLength - 1;
end
Sequence = [theSegments{theSegs}];
|