代码改变世界

玩了一天的XNA,感觉很有意思

2008-09-05 23:48  JimLiu  阅读(690)  评论(3编辑  收藏  举报

本来就很少做Winform的开发,还是弄游戏,感觉非常异样。从来我都是围绕Web学习的,突然换个东西,感觉完全是另一片天空。

说到游戏,不得不说这是非常考验编程和数学功底的一个方向。而且发现居然.NET类库里没有优先队列!这回要是玩迷宫类题目那C++那套“标记+PQ宽搜”就不好使了,不知道JAVA里有没有PQ。虽然泛型SortedDictionary<,>可以在一定程度上代替PQ,但是总觉得对于PQ还是堆实现的爽一点,看来受STL“毒害”不浅,下周争取写个堆实现的泛型PQ吧,反正核心算法也就10几行。

说道PQ,不得不想到数据结构了,开学前就开始计划组织自己的数据结构库,不过才写了并查集和字母树,并查集估计错不了了,字母树是最简单的忽略大小写的26结点字母树,还没测试过,字母树实现的也比较郁闷,总觉得每个结点上加个布尔量标记是天大的郁闷——我的确郁闷,2.0的Nullable类型居然只能用在值类型上,难道就不能统一一下Nullable,让Nullable给引用类型的时候相当于没用——起码给我编译通过呀……或者就是给泛型规则加一条Nullable,这样就方便多了。想起来还是C++里指针飞来飞去的,即惊险又方便。而且实现的容易,空间浪费不少。换作子树-兄弟树吧,会慢一些,而且代码比较复杂,不换了!NND¥%……&*

高级数据结构是一个都不会啊……网络流也完全不会……平衡二叉树都没写完。

赶紧实现数据结构啊,编译原理全是数据结构啊……

还有我的高精度除法……放假的时候写到晚上4点还没调对,衰啊

真是没想通数据结构课设的时候怎么做到几乎不靠数据结构的知识却写出还能打败不少人的五子棋AI的……

假以时日,我一定要逐渐完善我的C#数据结构类库!

说来啊,项目开发中的Utility库是很容易积累的,因为那些方法都是技巧居多,看到就很容易收下了,可是数据结构和算法就不一样,不但原理上有效率高低,实现上也有效率区别,很多数据结构和算法还有实际情况的针对性,必须酌情选择,到最后甚至还要进行常数级的优化,诸如乘法优化成位移,三角矩阵通过动态申请内存来比二维数组省一半空间……实在太难积累了。我觉得一个程序员的数据结构和算法库的优劣很大程度上就可以反应这个程序员功力的深浅——如果那些代码都是自己实现的话。

 

怀怀旧,发两个大二上写的数据结构的代码,呵呵

//快排
int quickSort(int l[], int low, int high){
    
if (low < high){
        
int pLow=low, pHigh=high;//p为轴
        int key = l[low];//用子序列的第一个作为轴
        while (pLow < pHigh){
            
while (pLow<pHigh && compare(key, l[pHigh]))
                pHigh
--;
            l[pLow] 
= l[pHigh];
            
while (pLow<pHigh && compare(l[pLow], key))
                pLow
++;
            l[pHigh] 
= l[pLow];
        }
        l[pLow] 
= key;
        
//划分完毕
        quickSort(l, low, pLow-1);//递归左边
        quickSort(l, pLow+1, high);//递归右边
    }
    
return 1;
}

//堆的维护,其实可以把堆维护写进堆排序的
//l[s]是只有根被破坏的堆,将其调整为子大顶堆
int heapAdjust(int l[], int s, int len){
    
while (2*+ 1 < len){
        
//l[s]是只有根被破坏的大顶堆,让根沿着较大的子向下搜索
        int j = 2*s+1;
        
if (j+1<len && compare(l[j], l[j+1]))
            j
++;
        
if (!compare(l[s], l[j]))
            
return 1;//维护完毕
        swap(l[s], l[j]);
        s 
= j;
    }
    
return 1;
}
//堆排序
int heapSort(int l[], int len){
    
for (int i=len/2-1; i>=0; i--)
        heapAdjust(l, i, len);
    
for (int i=len-1; i>0; i--){
        swap(l[
0], l[i]);
        heapAdjust(l, 
0, i);
    }
    
return 1;
}

P.S.对堆有特别的癖好,不知为什么……