DS博客做业07--查找

1.1思惟导图

1.2谈谈你对查找运算的认识及学习体会

本周学习了查找,学习了效率较好的平衡二叉树、b树、折半查找等算法。不论是设计程序,仍是打造产品,一个高性能的算法都极为重要,好比STL中的map和set使用了红黑树,高效的查找效率广受好评。
可是查找算法各自有着优缺点,选择合适的才是最好的,好比搜索引擎使用的倒排索引,很是适合在大量数据中快速找到目标。这些算法从诞生到如今,经受住了无数考验,已经很是成熟。深刻了解这些算法,对提升本身的内功颇有帮助(俗话说算法是内功)。

2.PTA实验做业

2.1.题目1:7-1 QQ账户的申请与登录

2.1.1设计思路

使用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";
    }
}

2.1.2代码截图



2.1.3本题PTA提交列表说明


A:使用map思路清晰通常不会有什么问题ios

2.2.题目2:7-2 航空公司VIP客户查询


2.2.1设计思路

仍是强大的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";
        }
    }

2.2.2代码截图


2.2.3本题PTA提交列表说明


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性能

2.3.题目3:7-3(选作) 基于词频的文件类似度


2.3.1设计思路

  • 1.数据读取?
    solution:使用getline直接读入一行存到一个string类型变量str中(我的不喜欢频繁读入),在结尾加上\n(这也是一个单词结束的标志),而后str进行操做,而后大写统一转换为小写(我的爱好),
  • 2.怎么获得文件的类似度?
    solution:此问题的关键在于选什么方式存放数据,发现文件的数量很少,能够直接定义一个map数组,为何使用map ?该题测试点的数据量比较大,容易超时,而map能够经过count函数,查找时间复杂度能够达到o(1),若是使用链式会达到o(n)。(主要是哈希思想,不限于map)(小声:以前用set要遍历就超时了,因此想到map)

初始数据读入学习

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";
    }

2.3.2代码截图



2.3.3本题PTA提交列表说明


A:开始是用set,查找须要遍历,最后一个测试点超时。(下面贴出遍历部分代码做为对比)
搜索引擎

3.阅读代码

3.1 题目

3.2 解题思路

使用二分查找,用a记录目标值开始位置,b记录结束位置

3.3 代码截图

3.4 学习体会

熟悉算法的原理,再加以改造就能够解决不少算法问题,每每效果还不错。
相关文章
相关标签/搜索