神代码

黄可嵩的程序遍历整个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.整个程序没有一行注释,建议以后在代码中养成写注释的习惯,便于别人和自己今后能够读懂。

完结。

时间: 2024-10-14 09:46:11

神代码的相关文章

js 神代码

eval(z='p="<"+"pre>"/* ,.oq#+ ,._, */;for(y in n="zw24l6k4e3t4jnt4qj24xh2 x/* =<,m#F^ A W###q. */42kty24wrt413n243n9h243pdxt41csb yz/* #K q##H######Am */43iyb6k43pk7243nmr24".split(4)){/* dP cpq#q##########b, */for(a

学习大神之‘MyBatis学习总结(一)’总结

1.准备工作 软件:eclipse. mysql .navicat for mysql 包:mybatis-3.1.1.jar   mysql-connector-java-5.1.7-bin.jar   2.创建项目 web项目在eclipse中是指动态web项目,即Dynamic web project. 源码放在src文件夹. jar包放在自建的lib文件夹下然后build path到当前项目中. 3.创建数据库和表 打开 MYSQL command line client,输入数据库密码

sqrt开平方算法的尝试,是的看了卡马克大叔的代码,我来试试用C#写个0x5f3759df和0x5f375a86跟System.Math.Sqrt到底哪个更强

今天笔试遇到一个代码题,要求写一个开平方算法,回来发现了雷神之锤里的一段神代码: 1 float Q_rsqrt( float number ) 2 { 3 long i; 4 float x2, y; 5 const float threehalfs = 1.5F; 6 x2 = number * 0.5F; 7 y = number; 8 i = * ( long * ) &y; // evil floating point bit level hacking 9 i = 0x5f3759d

Leetcode——————Group Anagrams

这道题对我来说比较难: 1.首先题目要求输出的结果,应该用什么形式的数据结构来存储呢 2.涉及到map,collection,sort( )等函数,或者其他的一堆东西,几乎一无所知. copy大神代码如下: public class Solution { //返回值是以链表作为节点的链表. public List<List<String>> groupAnagrams(String[] strs) { Map<String, List<String>> ma

hdu 1016 Prime Ring Problem

Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime. Note: the number of first circle should always be 1

算法学习——Count Complete Tree Nodes (计算完全二叉树的节点数)

完全二叉树——若设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树. 解题思路: 满二叉树有一个性质是节点数等于2^h-1(h为高度),所以可以这样判断节点的左右高度是不是一样,如果是一样说明是满二叉树,就可以用公式2^h-1(h为高度),如果左右不相等就递归计算左右节点. 具体代码如下: /** * Definition for a binary tree node. * public class Tr

poj 2184 Cow Exhibition(dp之01背包变形)

Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - Cows with Guns by Dana Lyons The cows want to prove to the public that they are both smart and fun. In order to do this, Bessie has organized an exhibitio

hdu 1598 find the most comfortable road(并查集+枚举)

find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4899    Accepted Submission(s): 2131 Problem Description XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超

数论小结2.

---恢复内容开始--- 今天江哥来个给我们讲一些数学方面的小知识...小小总结一下! 1. exgcd(). 1 inline ll exgcd(ll a,ll b,ll c){ 2 return c % a ? (exgcd(b % a, a, ((-c % a) + a) % a) * b + c) / a : c / a; 3 } 江哥的神代码... 非常简单直接就能求逆元. 2.线筛 prime && phi && 逆元 1 inline void sieve()