9.5-字串有序陣列的二分查詢
阿新 • • 發佈:2018-12-24
Given a sorted array of strings which is interspersed with empty strings, write a method to find the location of a given string.
Example: find “ball” in [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”, “dad”, “”, “”] will return 4
Example: find “ballcar” in [“at”, “”, “”, “”, “”, “ball”, “car”, “”, “”, “dad”, “”, “”] will return -1
可以直接遍歷一遍查詢,但是O(n)不夠好;
因為已經排好序,所以binary search.
每次t=mid,然後遇到空格就t++直到大於high。
1.如果t>high,說明[mid, high]這一段都是空格,就需要在[low, mid-1]去找。
2.如果在[mid, t]這一段裡面找到x,那麼就返回。
3.如果在[mid, t]第一個不是空格的string > x, 說明x要在[low, mid-1]去找。
3.如果在[mid, t]第一個不是空格的string < x, 說明x要在[t+1, high]去找。
#include <iostream> #include <string> using namespace std; int search(string s[], int low, int high, string x) { if(x=="") return -1; while(low<=high) { int mid=low+(high-low)/2; int t=mid; while(s[t]=="" && t<=high) t++; if(t>high) { high=mid-1; } else { if(s[t]==x) return t; else if(s[t]>x) high=mid-1; else low=t+1; } } return -1; } int main() { string s[13] = { "at", "", "", "", "ball", "", "", "car", "", "", "dad", "", "" }; cout<<search(s, 0, 12, "ball")<<endl; return 0; }