求解海量数据
统计英文单词出现的次数,并按照出现的顺序打印单词和它的次数
int main()
{
string strArr[] =
{
"hello", "sfdf", "rtyui", "vbn", "hello", "sfdf"};
// 统计上面的英文单词出现的次数,并按照出现的顺序打印单词和它的次数
vector<string> vec;
unordered_map<string, int> map;
for (string &str : strArr)
{
map[str]++;//用map记单词以及单次次数,紧接着传入vector 输出vector中的单词
vec.push_back(str);
}
for (string &str : vec)
{
auto it = map.find(str);
if (it != map.end())
{
cout << str << " " << map[str] << endl;
map.erase(str);//如果不查出来删掉会出现打两遍的结果 hello....hello..
}
}
return 0;
}
通过快排的分割,来求解海量数据top k的问题
如何通过快排的分割,来求解海量数据top k的问题
10000 值最大的前10个 / 值最大的第10个
/*
*/
template<typename T>
int partation(vector<T> &arr, int i, int j)
{
int val = arr[i];
while (i < j)
{
while (i < j && arr[j] > val)
{
j--;
}
if (i < j)
{
arr[i++] = arr[j];
}
while (i < j && arr[i] < val)
{
i++;
}
if (i < j)
{
arr[j--] = arr[i];
}
}
arr[i] = val;
return i;
}
// 2,3,6,5,8,0,3,1,9,10
template<typename T>
int selectValue01(vector<T> &vec, int i, int j, int k)
{
int pos = partation(vec, i, j);
if (pos == k - 1)
{
return pos;
}
else if (pos < k - 1)
{
//如果找到的位置是小于k的 说明得从右边再找 所以变动i下标
return selectValue01(vec, pos + 1, j, k);
}
else
{
return selectValue01(vec, i, pos - 1, k);
}
}
int main()
{
vector<int> vec;
for (int i = 0; i < 20; ++i)
{
vec.push_back(rand() % 100);
}
// 求vec容器中,值第5小和值第8大的元素,打印出来
for (int data : vec)
{
cout << data << " "