首页 新闻 搜索 专区 学院

C# 算法求教

0
悬赏园豆:50 [已解决问题] 解决于 2009-03-09 10:27

  今天在做一个小的程序,遇到了一个性能问题,List<User> 中有10W 条记录,

User 中存储为Id,Name,Ustr,Pwd 这些数据,

当一个用户登录是,登录名是Ustr是一个20位的string 类型。且Ustr 是唯一的。不区分大小写

当我从这10W条记录中查询是。速度很慢。不知道大家有没有好的方法。来加快这个速度!

KindSoul的主页 KindSoul | 菜鸟二级 | 园豆:245
提问于:2009-03-07 16:31
< >
分享
最佳答案
0

要具体情况具体分析,

1.List<User>是临时存储用户数据的对象,如果之做简单的1到2次使用就不要再排序了,即使是最快的排序算法也需要nlogn的平均时间复杂度。直接遍历的速度是O(n).

2.如果是长期保存用户信息,并且会给其他的用户使用来验证用户密码等,可以考虑排序。这样长远来看确实效率高了。

3.用户信息考虑别的方式存储,不知道是你数据源的原因还是代码实现的问题。一般考虑方式到数据库里处理。这个是通用的做法。

4.HashTable不错,但是受限制。效率很高o(1).信息是只有键值和键。

Frank Xu Lei | 小虾三级 |园豆:1860 | 2009-03-07 18:04
其他回答(9)
0

第一种方法:用Ustr做键存哈希表。

第二种方法:用Ustr排序,然后用二分查找,不要遍历。

zeus2 | 园豆:92 (初学一级) | 2009-03-07 16:56
0

是个难题啊,要是在数据库中就不成问题了。

yearN | 园豆:551 (小虾三级) | 2009-03-07 17:07
0

建立哈希表

private static System.Collections.Hashtable user= new System.Collections.Hashtable();

给哈希表赋值

user.Add(ID,Name);

…………

读取的时候用

select * from ..where Ustr=user[Ustr.ID]

或者:if(where Ustr=user[Ustr.ID])

不知道你怎么读取的数据下面的就没办法帮助你了!

子夜星辰 | 园豆:1613 (小虾三级) | 2009-03-07 17:14
0

如果User类是业务实体类,最好的方式是在业务逻辑相应的类中写个Get1User()方法......,而不是先获取所有然后存储在List<User>然后再检索。。。。

RealDigit | 园豆:255 (菜鸟二级) | 2009-03-07 17:32
0

恩,对对,如果说,你的数据类型可以改变,就使用hashtable就行了

如果不能改变,设计一下查找算法。先将你的list排序,然后二分法查找吧

如果速度再不行,就要换换查找算法了

llj098 | 园豆:825 (小虾三级) | 2009-03-07 18:28
0

换一下数据结构,这个样子吧

///key:User.Ustr value:User Instance

SortedDictionary<string,User> userDic = new SortedDictionary<string,User>();
userDic.Add( myUser.Ustr, myUser );

StevenChennet | 园豆:23 (初学一级) | 2009-03-07 22:08
0

  我是新手,来看看,看到hashtable还有这样的用法,真的很不错。

好学 | 园豆:210 (菜鸟二级) | 2009-03-07 23:11
0

用二分法,用简单的数据结构,提高查询速度。

winzheng | 园豆:8797 (大侠五级) | 2009-03-08 00:58
0

建一个内存索引

Dictionary<string, int> _Index = new Dictionary<string, int>;

键值是 Ustr, 指向该元素在 List<User> 列表中的序号。

如果不想用哈希建立索引,也可以考虑用堆排序实现插入排序。

或者用B+树也可以。

不过我还是觉得用哈希是最简单高效的。

eaglet | 园豆:17119 (专家六级) | 2009-03-09 07:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册