Skip to content

Instantly share code, notes, and snippets.

@snapbug
Created August 10, 2011 10:41
Show Gist options
  • Select an option

  • Save snapbug/1136534 to your computer and use it in GitHub Desktop.

Select an option

Save snapbug/1136534 to your computer and use it in GitHub Desktop.
43 Line C++ Index and Search
#include <algorithm>
#include <cmath>
#include <fstream>
#include <iostream>
#include <map>
#include <sstream>
#include <vector>
using namespace std;
int main(int argc, char **argv) {
string line, term;
ifstream file(argv[1]);
map<string, map<long, long> > index;
map<long, long>::iterator iter;
vector<string> documents;
while (file) {
getline(file, line);
stringstream ss(line);
long document_length = 0;
while (ss >> term && ++document_length)
index[term][documents.size()] = (iter = index[term].find(documents.size())) != index[term].end() ? iter->second + 1 : 1;
index[" length"][documents.size()] = document_length;
documents.push_back(line);
}
vector<pair<double, long> > results(documents.size());
while (cin) {
for (long i = 0; i < results.size(); i++)
results[i] = make_pair(0, i);
getline(cin, line);
stringstream ss(line);
while (ss >> term)
if (index.find(term) != index.end())
for (iter = index[term].begin(); iter != index[term].end(); ++iter)
results[iter->first].first += log(1.0 * documents.size() / index[term].size()) * iter->second / index[" length"][iter->first];
sort(results.rbegin(), results.rend());
for (vector<pair<double, long> >::iterator result_iter = results.begin(); result_iter != results.end() && result_iter->first; ++result_iter)
cout << result_iter->first << ": " << documents[result_iter->second] << endl;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment