本周学习了查找,学习了效率较好的平衡二叉树、b树、折半查找等算法。不论是设计程序,仍是打造产品,一个高性能的算法都极为重要,好比STL中的map和set使用了红黑树,高效的查找效率广受好评。 可是查找算法各自有着优缺点,选择合适的才是最好的,好比搜索引擎使用的倒排索引,很是适合在大量数据中快速找到目标。这些算法从诞生到如今,经受住了无数考验,已经很是成熟。深刻了解这些算法,对提升本身的内功颇有帮助(俗话说算法是内功)。
使用STL中的map关键字为帐号,值为密码。
int main() { 输出数据 for (i = 0 to T) { 输入数据 cin >> order >> account >> password; if (order == 'N') { 调用注册函数Register(account, password); } else { 调用登陆函数Login(account, password); } } return 0; }
void Register(string &account, string &password) { if(已经注册) cout << "ERROR: Exist\n"; else(没有注册) mymap[account] = password; cout << "New: OK\n"; }
void Login(string &account, string &password) { if (帐号不存在) { cout << "ERROR: Not Exist\n"; } else if(密码正确) { cout << "Login: OK\n"; } else 密码错误 { cout << "ERROR: Wrong PW\n"; } }
A:使用map思路清晰通常不会有什么问题ios
仍是强大的map,关键字为身份证,值为里程
取消流同步,加快读写速度,具体能够百度 ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); for (i = 0 to T) { 读入数据 cin >> id >> dist; if (dist < k)dist = k; mymap[id] += dist; } for (i = 0 to n) { if (若是是vip) { 输出里程 cout <<it->second<<"\n"; } else 若是不是 { cout << "No Info\n"; } }
A:读写太慢,运行超时,经过std::ios::sync_with_stdio(false)加快读写算法
原理数组
std::ios::sync_with_stdio(false)
这句语句是用来取消cin的同步,
什么叫同步呢?就是iostream的缓冲跟stdio的同步。若是你已经在头文件上用了using namespace std;那么就能够去掉前面的std::了。
取消后就cin就不能和scanf,sscanf, getchar, fgets之类同时用了,不然就可能会致使输出和预期的不同。 取消同步的目的,是为了让cin不超时,另外cout的时候尽可能少用endl,换用”\n”,也是防止超时的方法。固然,尽可能用scanf,printf就不用考虑这种由于缓冲的超时了。函数
原文:https://blog.csdn.net/lv1224/article/details/80084840性能
初始数据读入学习
for (i = 0 to N)文件数 { 读入数据 while (str[0] != '#')//开始处理 { 把单词放到string类型的temp中 for (遍历str) { if (str[j]是小写字母) { temp += str[j]; } else if (str[j]是大写字母) { temp += str[j] - 'A' + 'a'; } else str[j]不是字母,是单词结束标志 { int len = temp.size(); if (len > 0) { if (len> 2)长度不小于三、且不超过10的英文单词,长度超过10的只考虑前10个字母 { if (len > 10) temp = temp.substr(0, 10); mymap[i][temp] = 1; } temp.clear();temp每次要清空 } } } 读入数据 } }
类似度计算测试
for (i = 0 to T)T对比较数据 { for (; it != mymap[a].end(); it++)对其中一个遍历 { if (mymap[b].count(it->first) == 1)在另外一个中查找是否有相同单词 { sum++; } } 输出结果 num -= sum; cout << setiosflags(ios::fixed) << setprecision(1); cout << (sum * 100 / num)<<"%\n"; }
A:开始是用set,查找须要遍历,最后一个测试点超时。(下面贴出遍历部分代码做为对比)
搜索引擎
使用二分查找,用a记录目标值开始位置,b记录结束位置
熟悉算法的原理,再加以改造就能够解决不少算法问题,每每效果还不错。