Svmmarivm
Qvaerere et ordinare dvo svnt problemata fvndamentalia de collectionibvs, et inter ea commvtatio est: semel ordinare constat, sed omnem qvaesitionem posteriorem vilivs reddit. Lectio manv scribit qvaesitionem linearem et binariam, qvae in datis ordinatis dimidivm in qvoqve gradv reicit; binariam per invariantem svam ivstificat, eam terminari demonstrat, gyros eivs nvmerat et tres errores qvi eam pessvm dant stvdet. Seqvvntvr ordinatio per selectionem et per insertionem, cvm invariantibvs svis et accvrata nvmeratione comparationvm; deinde eadem problemata cvm bibliotheca intervallorvm, et ratio qvae decernit qvando expediat ante qvaesitionem ordinare.
Proposita discendi
- Qvaesitionem linearem et binariam implementare, et binariam per invariantem svam ivstificare («si valor adest, inter
lowethighest»), cvm demonstratione eam terminari. - Ordinationem per selectionem et per insertionem implementare, invariantem vtrivsqve envntiare et comparationes earvm in casv optimo et in casv pessimo nvmerare.
std::ranges::sort,std::ranges::contains,std::ranges::find,std::ranges::binary_searchetstd::ranges::lower_boundloco versionvm propriarvm adhibere, cvm res postvlat, praecondiciones earvm servando.- Pro nvmero qvaesitionvm praevisarvm decernere vtrvm expediat data ante qvaesitionem ordinare, et decisionem nvmeratione comparationvm ivstificare.
Qvaesitio linearis
Qvaerere est respondere, data collectione et valore, vtrvm valor adsit et vbi. Sine notitia de ordine datorvm, nvlla alia ratio est qvam ea singvla inspicere: haec est qvaesitio linearis. Cvm valor non adest, hic cvrsvs values.size() reddit, primam positionem qvae ad vectorem non pertinet: index validvs non est, ita vt cvm responso non confvndatvr, et eadem conventio est qvam bibliotheca seqvitvr, vt in qvinta sectione videbitvr.
#include <cstddef>#include <print>#include <vector>// Praecondicio: nvlla.// Postcondicio: reddit minimvm indicem i cvm values[i] == target,// vel values.size(), si target non adest.std::size_t linearSearch(const std::vector<int>& values, int target){ // Invarians: target non est in values[0], ..., values[i - 1]. for (std::size_t i{0}; i < values.size(); ++i) { if (values[i] == target) { return i; } } return values.size();}int main(){ const std::vector<int> codes{405, 112, 318, 207, 112, 530}; for (const int target : {207, 112, 999}) { const std::size_t pos{linearSearch(codes, target)}; if (pos == codes.size()) { std::println("{}: non adest", target); } else { std::println("{}: positio {}", target, pos); } }}207: positio 3112: positio 1999: non adestInvarians versvs 10 rectitvdinem praebet. Initio, cvm i aeqvalis est 0, aliqvid de tractv vacvo affirmat et vera est. Si initio gyri valet et values[i] non est valor qvaesitvs, in fine eivs valet cvm vno elemento plvs. Iam vero circvitvs dvos exitvs habet: si return i; exseqvitvr, values[i] est valor qvaesitvs et, per invariantem, nvllvm elementvm anterivs erat, vnde i est prima occvrrentia (qvam ob rem 112, qvi bis apparet, in positione 1 nvntiatvr); si circvitvs per condicionem terminatvr, i valet values.size() et invarians dicit valorem nvsqvam esse. return intra circvitvm fvnctionem terminat, et cvm ea circvitvm, et vexillvm parcit.
Svmptvs, eo sensv qvo lectio Svmptvs algorithmi eam vocem adhibet, comparationibvs values[i] == target metitvr. Si valor non adest, accvrate fivnt, vna pro qvoqve elemento: casvs pessimvs. Si in positione est, fivnt. Qvaesitio linearis est igitvr : cvm dvplo datorvm, dvplvm laboris. Sine notitia additicia melivs fieri non potest: algorithmvs qvi vnvm elementvm inspicere omitteret nesciret vtrvm valor ibi esset.
Argvmentvm oneratvr…