სიმებიანი ძიების ალგორითმი გამოიყენება კონკრეტული ნიმუშის(ქვესტრიქონის) შემთხვევების მოსაძებნად უფრო დიდ ტექსტში(სტრიქონი). ეს ალგორითმი გადამწყვეტ როლს ასრულებს ტექსტის დამუშავების, ძიების და მანიპულირების ამოცანებისას.
Როგორ მუშაობს
- დაიწყეთ საძიებელი ტექსტით(სტრიქონი) და ნიმუშით(ქვესტრიქონი).
- გაიმეორეთ ტექსტში თითო სიმბოლო.
- ტექსტის თითოეული სიმბოლოსთვის შეადარეთ იგი ნიმუშის პირველ სიმბოლოს.
- თუ არსებობს შესატყვისი, შეამოწმეთ, შეესაბამება თუ არა შემდეგი სიმბოლოები ნიმუშს.
- თუ ნიმუში მთლიანად ემთხვევა, ჩაწერეთ მატჩის საწყისი პოზიცია.
- განაგრძეთ ნიმუშის ძებნა ტექსტში.
მაგალითი
განვიხილოთ ტექსტი: "ababcababcabcabc" და ნიმუში: "abc"
- დაიწყეთ 0 პოზიციიდან. შეადარეთ "a" ნიმუშის პირველ სიმბოლოს "a".
- ნაპოვნია შესატყვისი, გადადით შემდეგ სიმბოლოებზე: „b“ „b“-ით და „a“ „c“-ით.
- გააგრძელეთ შესატყვისი: „ბ“ „ა“, „ა“ „ბ“-ით და „ბ“ „გ“-ით.
- მატჩი ჩაიშალა მე-2 პოზიციაზე.
- თავიდან დაიწყეთ მე-3 პოზიციიდან. შეადარეთ "a" შაბლონის პირველ სიმბოლოს "a".
- წარმატებული მატჩი: „ა“ „ა“-სთან, „ბ“ „ბ“-სთან და „გ“ „გ“-ით.
- ჩაწერეთ პოზიცია 3.
ნიმუში "abc" გვხვდება 0, 6 და 9 პოზიციებზე.
კოდის მაგალითი C++-ში
#include <iostream>
#include <string>
#include <vector>
std::vector<int> stringSearch(const std::string& text, const std::string& pattern) {
std::vector<int> positions;
for(int i = 0; i <= text.length()- pattern.length(); ++i) {
int j = 0;
while(j < pattern.length() && text[i + j] == pattern[j]) {
++j;
}
if(j == pattern.length()) {
positions.push_back(i);
}
}
return positions;
}
int main() {
std::string text = "ababcababcabcabc";
std::string pattern = "abc";
std::vector<int> result = stringSearch(text, pattern);
std::cout << "Pattern found at positions: ";
for(int pos: result) {
std::cout << pos << ";
}
std::cout << std::endl;
return 0;
}
ამ მაგალითში, stringSearch
ფუნქცია გამოიყენება "abc" ნიმუშის შემთხვევების საპოვნელად ტექსტში "ababcababcabcabc". შედეგი იქნება ვექტორი, რომელიც შეიცავს მატჩების სასტარტო პოზიციებს.