Algorithm to find the smallest snippet from searching a document?

前端 未结 7 1431
太阳男子
太阳男子 2021-01-30 07:57

I\'ve been going through Skiena\'s excellent \"The Algorithm Design Manual\" and got hung up on one of the exercises.

The question is: \"Given a search string of three w

7条回答
  •  [愿得一人]
    2021-01-30 08:15

    O(n log k) solution, where n is the total number of indices and k is the number of words. The idea is to use a heap to identify the smallest index at each iteration, while also keeping track of the maximum index in the heap. I also put the coordinates of each value in the heap, in order to be able to retrieve the next value in constant time.

    #include 
    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    
    int snippet(const vector< vector >& index) {
        // (-index[i][j], (i, j))
        priority_queue< pair< int, pair > > queue;
        int nmax = numeric_limits::min();
        for (size_t i = 0; i < index.size(); ++i) {
            if (!index[i].empty()) {
                int cur = index[i][0];
                nmax = max(nmax, cur);
                queue.push(make_pair(-cur, make_pair(i, 0)));
            }
        }
        int result = numeric_limits::max();
        while (queue.size() == index.size()) {
            int nmin = -queue.top().first;
            size_t i = queue.top().second.first;
            size_t j = queue.top().second.second;
            queue.pop();
            result = min(result, nmax - nmin + 1);
            j++;
            if (j < index[i].size()) {
                int next = index[i][j];
                nmax = max(nmax, next);
                queue.push(make_pair(-next, make_pair(i, j)));
            }
        }
        return result;
    }
    
    int main() {
        int data[][3] = {{1, 4, 5}, {4, 9, 10}, {5, 6, 15}};
        vector > index;
        for (int i = 0; i < 3; i++) {
            index.push_back(vector(data[i], data[i] + 3));
        }
        assert(snippet(index) == 2);
    } 
    

提交回复
热议问题