考一个比较经典的问题(3) “查找”

zjxiaoyu 2005-07-14 02:25:25
电话本查找:
现在有一个电话本,就是
struct
{
char number[20];
char name[30];
}PhoneBook;
的数组,比如说有15000个,怎样才能做到最快的查找。匹配方法:只匹配后七位,后七位相同的,只要找到,随便哪个都行。
number[]就是类似于"02150802123","+8613917040236"之类的,其他字符都是不合法的,不会出现。
(这个是在《编程珠玑》中第一章讲的,同时也是我们项目中遇到的问题。
算法复杂度是O(n),还有用链表存储的解决方案,不做考虑)
...全文
317 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjxiaoyu 2005-07-18
  • 打赏
  • 举报
回复
languagec(看过的都踩一脚)
就知道抄抄书,开15000个数组,然后里面对应某个数字,这个数字怎么来的?我最开始的题目是一串字符串。
另外那个15000的数组某个位置1了有什么用?怎么查到电话本里的名字?
最烦那种没看题目,乱唧唧歪歪的人。
languagec 2005-07-16
  • 打赏
  • 举报
回复
才 15000 呀 ,开 150000 都可以.
popcom 2005-07-15
  • 打赏
  • 举报
回复
排序以后,然后二分法
xiaomuzi7337 2005-07-15
  • 打赏
  • 举报
回复
为长期打算还是先排序,然后用折半再好了,也可以乱的话用快速查找也不错,
zjxiaoyu 2005-07-15
  • 打赏
  • 举报
回复
languagec(看过的都踩一脚)
那个,我15000条记录该怎么设置那个数组?
xiaomuzi7337 2005-07-15
  • 打赏
  • 举报
回复
为长期打算还是先排序,然后用折半再好了,也可以乱的话用快速查找也不错,
languagec 2005-07-15
  • 打赏
  • 举报
回复
《编程珠玑》里举的是这么个例子:有很多1-1000000..之间的数,每个数都不重复,要求对这些数排序.
首先数很多,不能一次全部读入内存.它介绍了几种解决方法,比如将数分段1-100000之间的先排,再排100000-200000 之间的,这样将会扫描同一个文件很多次.最后它介绍了一种很巧妙的排序方法,时间复杂度是O(n) .
算法是这样的:开一个数组 比如arry[100...],考虑下面一串数,1,5,2,8,7,4,9,6 .
我们读入一个数就把和数相对应的数组里的位 置1,那么数组里被置一的位有 1 2 4 5 6 7 8 9,我们顺序扫描数组,就得出一个有序的数列.

我想《编程珠玑》里已经讲得很清楚了,不知道楼主是什么意思?
zjxiaoyu 2005-07-15
  • 打赏
  • 举报
回复
那天跟同事又讨论了一下。一致的看法是把后七位通过某种算法(hash或者别的)弄成一个整数来作为key值,进行排序。
其中一种最直观,也最简单的方法是用atoi()函数,把那七位做成一个32bit的数。比如"02151802123",就是1802123,也就是0x1B7F8B。每回查找匹配都按这个来。
其他的hash函数,目前还没想到。
whatsouta 2005-07-15
  • 打赏
  • 举报
回复
只匹配后七位,应该是指号码了?

那么多的数据,最好排序一下

考虑分组存放,最后七位对组数(比如分20组,则对20)取模确定组号。这样能减少好多的比较次数
  • 打赏
  • 举报
回复
直接把号码的后七位取出来跟要找的字符串进行比较好不好?
winks 2005-07-14
  • 打赏
  • 举报
回复
如果用工程性思考的话,我觉得可以先排好序,如果号码再增加也按序插入
以后查找的时候就可以用折半查找进行查找了。
jixingzhong 2005-07-14
  • 打赏
  • 举报
回复
用HASH是否可行??




要是先排序..........


会不会狠麻烦??

不过用插入好象也可以,

就是开始的时候麻烦,

以后数据更新还是比较容易的。

可以考虑!
hj008 2005-07-14
  • 打赏
  • 举报
回复
我觉得也是先排序,如果不排序根本没法找.

可是用什么方法排序呢?
zjxiaoyu 2005-07-14
  • 打赏
  • 举报
回复
最慢的办法就是O(n)的线性遍历的方法,逐个字符串匹配。最坏的运算次数大约是n*7。7就是要比较的那后7位号码。
xjtuzhw 2005-07-14
  • 打赏
  • 举报
回复
查找一般的方法都是针对于有序序列的,如果是一个无序的大数组,最好采用分段多线程遍历吧
OpenHero 2005-07-14
  • 打赏
  • 举报
回复
学习,学习~~
应该是都是有存储顺序吧~~~
Roaming_Sheep 2005-07-14
  • 打赏
  • 举报
回复
如果用hash呢?
languagec 2005-07-14
  • 打赏
  • 举报
回复
既然看过《编程珠玑》,就照着它做就行了嘛
zjxiaoyu 2005-07-14
  • 打赏
  • 举报
回复
肯定得先排序,我们的要求是查找时最快。关键是怎么排序,怎么查找。
Willpro 2005-07-14
  • 打赏
  • 举报
回复
如果你的电话本是有序的多好!~·~,无序的话,算法复杂度还可以比O(n)还小吗!!!!得了,别不懂装懂了,老实做沙发吧

WWW.MARK.COM//help you up

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧