POJ2503(二分查找)

本文介绍了一种使用快速排序和二分查找优化字典条目查找效率的方法,包括输入流处理技巧,如使用peek()函数和移除换行符。通过实践案例,展示了如何在大数据量下实现快速精准的查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:就像查找一本字典,根据输入的条目和要查询的单词,给出查询结果(每个单词长度不超过10),所查单词数不超过100 000.

解题思路:由于数据量很大,即使我用了scanf 和 printf 还是会超时。所以如果依次遍历要查找的单词速度很慢。后来发现用二分查找就很容易,但要二分必须对单词进行排序,故用到了标准库函数qsort进行快速排序。

另外,对于数据输入需要特别注意,以前遇到过类似的情况,所以就学会了应用peek() 函数。函数peek()用于输入流中,并返回在流中的下一个字符或如果是处于被入的文件的结尾处返回EOF,peek()不会把字符从流中移除。所以必须用getchar() 来消除换行符。

ExpandedBlockStart.gifView Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<stdlib.h>//快速排序的标准库函数qsort的头文件
 4 #include<cstring>
 5 using namespace std;
 6 #define MAX 100005
 7 struct word{
 8     char str1[15],str2[15];
 9 }w[MAX];
10 
11 int n=0;
12 int cmp(const void *a,const void *b)
13 {
14     return strcmp((*(word *)a).str2,(*(word *)b).str2);
15 }
16 
17 int Search(char str[])
18 {
19     int t,mid,low=0,high=n-1;
20     while(low<=high)
21     {
22         mid=(low+high)/2;
23         t=strcmp(w[mid].str2,str);
24         if(t==0return mid;
25         else if(t==-1
26             low=mid+1;
27         else 
28             high=mid-1;
29     }
30     return -1;
31 }
32 
33 int main()
34 {
35     char str[20];
36     int k,f=1;
37     while(f)
38     {
39         cin>>w[n].str1>>w[n].str2;
40         n++;
41         getchar(); //移除换行符
42         //函数peek()用于输入流中,并返回在流中的
43         //下一个字符,peek()不会把字符从流中移除
44         if(cin.peek()=='\n') f=0;
45     }
46     qsort(w,n,sizeof(word),cmp);
47     while(cin>>str)
48     {
49         k=Search(str);
50         if(k==-1) cout<<"eh"<<endl;
51         else cout<<w[k].str1<<endl;
52     }
53     return 0;
54 }

 

转载于:https://www.cnblogs.com/yueshuqiao/archive/2012/03/07/2383052.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值