🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #12011

C++: optimalizatie voor dit stukje code ? (STL ?)

#12011
From: London Rain
Date: Fri, 28 Dec 2001 15:00
73 lines
3629 bytes
Hallo,

Ik heb een hier een C++ functie gemaakt die controleert of een (kleinere)
std::vector voorkomt in een andere, grotere std::vector (in de originele
volgorde).

Je vindt de code onderaan dit bericht, dit doet perfect wat het moet doen
(is ook niet moeilijk ;-)
Nu is echter die 'findPattern(...)' zowat de belangrijkste functie uit mijn
programma en wordt voortdurend opgeroepen met (grote) vectors. (Er worden in
totaal tientallen tot honderden megabytes doorzocht...)

Het probleem is dat mijn stukje (sequentiele) code niet echt snel is, en ik
ben dus op zoek naar elke mogelijke optimalizatie.

In eerste instantie dacht ik aan <algorithm> uit de C++ Standard Library:

'find' doorzoekt een sequentie/container naar 1 bepaalde waarde, terwijl we
zoeken naar een andere sequentie/container...

'find_first_of' onderzoekt of 1 van de elementen uit de 2e
sequentie/container in de 1e zit, terwijl we dus willen weten of de
volledige 2e sequentie/container in de 1e zit...

'includes' veronderstelt een gesorteerde input (of op zijn minst een
operator< ?)
Maar sorteren mag niet want dan gaat de betekenis van de vector verloren...
Een (zelf gemaakte) binaire search kan dus ook niet, want de vector is niet
gesorteerd (en moet in de originele orde blijven).


Dus weet iemand of ik mijn 'findPattern(...)' kan formuleren als een call
naar de Standard Library? (in de hoop dat die code efficienter is)

Of weet iemand een URL/library/... met optimalizaties voor dit soort zoeken?

De functie, zoals ze hieronder staat, moet eigenlijk niet letterlijk. Dwz
een boolean als return als de 2e vector in de 1e vector voorkomt, volstaat
al.

Alvast bedankt !



// Search for 'pattern' in large 'string' 'dump'
// return number of matches
int findPattern(const vector<BYTE>& dump, const vector<BYTE>& pattern) {
    int nMatches = 0;

    if (dump.size() >= pattern.size())

        int i = 0;
        while (i < dump.size())

        // not yet at end of dump
            if (dump[i] == pattern[0])

            // first byte of pattern matches a byte of dump
                int j = 0;
                while ((j < pattern.size()) && (dump[i+j] == pattern[j])) {
                // not yet at end of pattern
                    ++j;
                }
                if (j == pattern.size()) {  // reached end of pattern
                    // perfect match from dump[i] tot dump[i+j-1]
                    ++nMatches;
                }
            }
            ++i;      // move to next byte
        }
    }
    return nMatches;
}
Technical Details
Message-ID: <yO%W7.185$c01.77305980@hebe.telenet-ops.be>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!news.tele.dk!small.news.tele.dk!193.190.198.17!newsfeeds.belnet.be!news.belnet.be!ossa.telenet-ops.be!hebe.telenet-ops.be.POSTED!not-for-mail

Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit
X-Google-Thread: fcea4,240f4ca098035d9d,start
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2001-12-28 07:01:00 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!news.tele.dk!small.news.tele.dk!193.190.198.17!newsfeeds.belnet.be!news.belnet.be!ossa.telenet-ops.be!hebe.telenet-ops.be.POSTED!not-for-mail
From: "London Rain" <londonrain@pandora.be>
Newsgroups: be.comp.programming
Subject: C++: optimalizatie voor dit stukje code ? (STL ?)
Lines: 75
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 5.00.2919.6700
X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2919.6700
Message-ID: <yO%W7.185$c01.77305980@hebe.telenet-ops.be>
Date: Fri, 28 Dec 2001 15:00:46 GMT
NNTP-Posting-Host: 213.224.67.186
X-Complaints-To: abuse@pandora.be
X-Trace: hebe.telenet-ops.be 1009551646 213.224.67.186 (Fri, 28 Dec 2001 16:00:46 CET)
NNTP-Posting-Date: Fri, 28 Dec 2001 16:00:46 CET
Organization: Telenet Internet