黄可嵩的程序遍历整个Microsoft Visual Studio 11.0目录耗时不到5秒,秒杀了所有人,如愿以偿的获得了个人项目的满分。再想想自己的程序,扫描同样的目录根本不知道何时才能结束,简直弱爆了。几乎所有人都在揣测,嵩神的作业到底用了何种高级的算法和数据结构,因此在提交完个人项目之后,我便向室友索要了他的程序,想一探究竟。我不仅是把他的这段代码当做学习的样品,更是当做一种艺术品来收藏,因为他给出了一种在别人看来不可能的神之解。在我看来,同一个问题只有一个解,那就是最优的那个,我不管做什么事都在努力寻找一种最优的解。
今天,根据代码复审的要求,我再次看了这个程序,比第一次看有了更多的收获
优点:
1性能与效率简直无与伦比,原因在于使用.net frame work中的Dictionary类,该类使用的是关键字当索引,虽然我用了C++中的map与此类似,但是他们内部实现的结构有所不同,map使用的是红黑树,而Dictionary使用的是哈希表,所以Dictionary要快得多。
2.逻辑清晰,类的划分很合理。
与程序运行的性能相比,其他优点已经不再是有点了,所以不再赘述。
虽然这个程序已近乎完美,但是还有很多小地方如果再完善一下的话就十全十美了。以下是一些
不好的地方:
1.对于fileanalysis分析单词和词组的文件,可以考虑增加几个函数来实现代码复用,这样不仅能让代码显得更加精简避免冗长,而且有利于维护;
2.作者当时没有考虑到扩展的大小写,所以不能识别诸如1.TXT这样的文件;
改进方案,在equals方法中添加参数StringComparison.CurrentCultureIgnoreCase以实现忽略大小的比较
原来的代码:
if (substr.Equals(".txt") || substr.Equals(".cpp") || substr.Equals(".h") || substr.Equals(".cs"))
修改后的代码:
if (substr.Equals(".txt", StringComparison.CurrentCultureIgnoreCase) || substr.Equals(".cpp", StringComparison.CurrentCultureIgnoreCase) || substr.Equals(".h", StringComparison.CurrentCultureIgnoreCase) || substr.Equals(".cs", StringComparison.CurrentCultureIgnoreCase))
3.C#提供了一个ICompare的实现类StringCompare,可以用它来作为orderBy的参数实现单词按ASCII排序,
原来的代码:
var dicsorts = dic.OrderByDescending(sort => sort.Value.getfreq()).ThenBy(sort => sort.Value.getword(), cpr);
修改后如下:
var dicsorts = dic.OrderByDescending(sort => sort.Value.getfreq()).ThenBy(sort => sort.Value.getword(), StringComparer.Ordinal);
4.整个程序没有一行注释,建议以后在代码中养成写注释的习惯,便于别人和自己今后能够读懂。
完结。