• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            life02

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              197 隨筆 :: 3 文章 :: 37 評(píng)論 :: 0 Trackbacks

            #

            題目轉(zhuǎn)自:
            http://blog.163.com/ecy_fu/blog/static/444512620098228849190/
             二筆只有三道題,分值分別為30, 30, 40,題分別如下:
            1、實(shí)現(xiàn)strtol函數(shù),其原型如為int strtol(const char *num_str, char **endptr, int base),num_str存放待轉(zhuǎn)換的字符串,可以是負(fù)數(shù)也可以是正數(shù);endptr指向第一個(gè)非法字符的地址,如果endptr為NULL則不指向第一個(gè)非法字符的地址;base用于指示進(jìn)制,若base為0,則根據(jù)num_str的指示來轉(zhuǎn)換。函數(shù)必須檢查溢出,如果正數(shù)溢出,返回INT_MAX;若負(fù)數(shù)溢出,返回INT_MIN。
            2、一億個(gè)數(shù)找最大的1000個(gè)數(shù),要求效率高占用內(nèi)存少。函數(shù)原型為:find_max_data(int* source_data, int* max_data),其中source_data是存放一億個(gè)數(shù)的數(shù)組,max_data用于存放其中最大的1000個(gè)數(shù)。
            3、將一個(gè)集合拆分成兩個(gè)不相交的子集,兩個(gè)子集元素之和相等,如{1, 2, 3, 4, 5, 6, 7},拆分成:
            {2, 5, 7}, {1, 3, 4, 6}
            給出一個(gè)集合,求所有符合上面要求的拆分,效率最高分越高,函數(shù)原型為int cal_num(int n);

            第三題:
            利用回溯剪枝法
            空間復(fù)雜度:O(n) 棧的最大深度也就是n了
            時(shí)間復(fù)雜度:接近于O(2^n-1), 因?yàn)楸举|(zhì)上程序時(shí)一個(gè)遍歷樹的過程,如果沒有剪枝,那么樹是一個(gè)滿二叉樹,結(jié)點(diǎn)共2^n-1個(gè),也就要遍歷2^n-1次。雖然剪枝,但速度估計(jì)仍是 2^n次方級(jí)別的。
            試了下,調(diào)用cal_num(104),好久了結(jié)果都沒有出來。。。

            不知用上DP算法會(huì)不會(huì)好點(diǎn),不過聽說回溯法怎么弄效率都跟不上,最好用遞推?
            在哪聽說的?
            http://topic.csdn.net/u/20090922/11/ebc26b48-6581-40c3-afe0-a95ca2d700d5.html

             

            /////////////////////////////////////////////////////////////////
            //file divide_set.h:

            #ifndef __DIVIDE_SET_H__
            #define __DIVIDE_SET_H__

            // 計(jì)算集合set的所有滿足下列條件的子集合:子集合元素之和等于value
            // 子集合的元素對(duì)應(yīng)的label置1
            void divide_set( int set[], int label[], int len, int i_set, int value );

            // 對(duì)集合{1,2,n}劃分
            void cal_num( int n );

            #endif


            /////////////////////////////////////////////////////////////////
            //file divide_set.cpp:

            #include 
            "stdafx.h"
            #include 
            "divide_set.h"

            #include 
            <iostream>

            using namespace std;

            // 查找集合set中,滿足元素之和等于value的子集合,結(jié)果存于label里
            void divide_set( int set[], int label[], int len, int i_set, int value )
            {
             
            // 輸出結(jié)果
             if ( value == 0 )
             
            {
              cout
            <<"";
              
            for ( int i=0; i<len; ++i )
              
            {
               
            if ( label[i] )
               
            {
                cout
            <<set[i]<<" ";
               }

               
              }

              cout
            <<"";
              cout
            <<" , { ";
              
            for ( int i=0; i<len; ++i )
              
            {
               
            if ( 0 == label[i] )
               
            {
                cout
            <<set[i]<<" ";
               }

              }

              cout
            <<"";
              cout
            <<endl;
              
            return;
             }


             
            if ( i_set >= len || value <0)
             
            {
              
            return;
             }


             
            // 取第i_set個(gè)元素
             label[i_set] = 1;
             divide_set( 
            set, label, len, i_set+1, value-set[i_set] );
             
             
            // 不取第i_set個(gè)元素
             label[i_set] = 0;
             divide_set( 
            set, label, len, i_set+1, value );
            }


            void cal_num( int n )
            {
             
            int* set = new int[n];
             
            int* label = new int[n];

             
            // initialize set and label
             int sum_value = 0;
             
            for ( int i=0; i<n; ++i )
             
            {
              
            set[i] = i+1;
              sum_value 
            += set[i]; 
             }

             memset( label, 
            0, n*sizeof(int) );

             
            // 保證元素總和為偶數(shù)
             if( sum_value%2 == 0 )
              divide_set( 
            set, label, n, 0, sum_value/2 );

             delete[] 
            set;
             delete[] label;
            }


             

            本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/zdl1016/archive/2009/10/04/4632688.aspx

            posted @ 2009-10-07 11:08 life02 閱讀(528) | 評(píng)論 (1)編輯 收藏

            面試過程中,面試官會(huì)向應(yīng)聘者發(fā)問,而應(yīng)聘者的回答將成為面試官考慮是否接受他的重要依據(jù)。對(duì)應(yīng)聘者而言,了解這些問題背后的“貓膩”至關(guān)重要。本文對(duì)面試中經(jīng)常出現(xiàn)的一些典型問題進(jìn)行了整理,并給出相應(yīng)的回答思路和參考答案。讀者無需過分關(guān)注分析的細(xì)節(jié),關(guān)鍵是要從這些分析中“悟”出面試的規(guī)律及回答問題的思維方式,達(dá)到“活學(xué)活用”。
             
              問題一:“請(qǐng)你自我介紹一下”
             
              思路: 1、這是面試的必考題目。 2、介紹內(nèi)容要與個(gè)人簡(jiǎn)歷相一致。 3、表述方式上盡量口語化。 4、要切中要害,不談無關(guān)、無用的內(nèi)容。 5、條理要清晰,層次要分明。6、事先最好以文字的形式寫好背熟。
             
              問題二:“談?wù)勀愕募彝デ闆r”
             
              思路:1、 況對(duì)于了解應(yīng)聘者的性格、觀念、心態(tài)等有一定的作用,這是招聘單位問該問題的主要原因。 2、 簡(jiǎn)單地羅列家庭人口。 3、 宜強(qiáng)調(diào)溫馨和睦的家庭氛圍。 4、 宜強(qiáng)調(diào)父母對(duì)自己教育的重視。 5、 宜強(qiáng)調(diào)各位家庭成員的良好狀況。 6、 宜強(qiáng)調(diào)家庭成員對(duì)自己工作的支持。 7、 宜強(qiáng)調(diào)自己對(duì)家庭的責(zé)任感。
             
                問題三:“你有什么業(yè)余愛好?”
             
              思路: 1、 業(yè)余愛好能在一定程度上反映應(yīng)聘者的性格、觀念、心態(tài),這是招聘單位問該問題的主要原因。 2、 最好不要說自己沒有業(yè)余愛好。 3、 不要說自己有那些庸俗的、令人感覺不好的愛好。 4、 最好不要說自己僅限于讀書、聽音樂、上網(wǎng),否則可能令面試官懷疑應(yīng)聘者性格孤僻。 5、 最好能有一些戶外的業(yè)余愛好來“點(diǎn)綴”你的形象。
             
              問題四:“你最崇拜誰?”
             
              思路: 1、 最崇拜的人能在一定 程度上反映應(yīng)聘者的性格、觀念、心態(tài),這是面試官問該問題的主要原因。 2、 不宜說自己誰都不崇拜。 3、 不宜說崇拜自己。 4、 不宜說崇拜一個(gè)虛幻的、或是不知名的人。 5、 不宜說崇拜一個(gè)明顯具有負(fù)面形象的人。 6、 所崇拜的人人最好與自己所應(yīng)聘的工作能“搭”上關(guān)系。 7、 最好說出自己所崇拜的人的哪些品質(zhì)、哪些思想感染著自己、鼓舞著自己。
             
              問題五:“你的座右銘是什么?”
             
              思路: 1、座右銘能在一定程度上反映應(yīng)聘者的性格、觀念、心態(tài),這是面試官問這個(gè)問題的主要原因。 2、不宜說那些醫(yī)引起不好聯(lián)想的座右銘。 3、不宜說那些太抽象的座右銘。 4、不宜說太長(zhǎng)的座右銘。 5、座右銘最好能反映出自己某種優(yōu)秀品質(zhì)。 6、 參考答案——“只為成功找方法,不為失敗找借口”。
             
              問題六:“談?wù)勀愕娜秉c(diǎn)”
             
              思路: 1、 不宜說自己沒缺點(diǎn)。 2、 不宜把那些明顯的優(yōu)點(diǎn)說成缺點(diǎn)。 3、 不宜說出嚴(yán)重影響所應(yīng)聘工作的缺點(diǎn)。 4、 不宜說出令人不放心、不舒服的缺點(diǎn)。 5、 可以說出一些對(duì)于所應(yīng)聘工作“無關(guān)緊要”的缺點(diǎn),甚至是一些表面上看是缺點(diǎn),從工作的角度看卻是優(yōu)點(diǎn)的缺點(diǎn)。
             
              問題七:“談一談你的一次失敗經(jīng)歷”
             
              思路: 1、 不宜說自己沒有失敗的經(jīng)歷。 2、 不宜把那些明顯的成功說成是失敗。 3、 不宜說出嚴(yán)重影響所應(yīng)聘工作的失敗經(jīng)歷, 4、 所談經(jīng)歷的結(jié)果應(yīng)是失敗的。 5、 宜說明失敗之前自己曾信心白倍、盡心盡力。 6、 說明僅僅是由于外在客觀原因?qū)е率 ?7、 失敗后自己很快振作起來,以更加飽滿的熱情面對(duì)以后的工作。

              問題八:“你為什么選擇我們公司?”
             
              思路: 1、 面試官試圖從中了解你求職的動(dòng)機(jī)、愿望以及對(duì)此項(xiàng)工作的態(tài)度。 2、 建議從行業(yè)、企業(yè)和崗位這三個(gè)角度來回答。 3、 參考答案——“我十分看好貴公司所在的行業(yè),我認(rèn)為貴公司十分重視人才,而且這項(xiàng)工作很適合我,相信自己一定能做好。”

              問題九:“對(duì)這項(xiàng)工作,你有哪些可預(yù)見的困難?”
             
              思路: 1、 不宜直接說出具體的困難,否則可能令對(duì)方懷疑應(yīng)聘者不行。 2、 可以嘗試迂回戰(zhàn)術(shù),說出應(yīng)聘者對(duì)困難所持有的態(tài)度——“工作中出現(xiàn)一些困難是正常的,也是難免的,但是只要有堅(jiān)忍不拔的毅力、良好的合作精神以及事前周密而充分的準(zhǔn)備,任何困難都是可以克服的。”

              問題十:“如果我錄用你,你將怎樣開展工作”
             
              思路: 1、 如果應(yīng)聘者對(duì)于應(yīng)聘的職位缺乏足夠的了解,最好不要直接說出自己開展工作的具體辦法, 2、 可以嘗試采用迂回戰(zhàn)術(shù)來回答,如“首先聽取領(lǐng)導(dǎo)的指示和要求,然后就有關(guān)情況進(jìn)行了解和熟悉,接下來制定一份近期的工作計(jì)劃并報(bào)領(lǐng)導(dǎo)批準(zhǔn),最后根據(jù)計(jì)劃開展工作。”
             
              問題十一:“與上級(jí)意見不一是,你將怎么辦?”
             
              思路: 1、 一般可以這樣回答“我會(huì)給上級(jí)以必要的解釋和提醒,在這種情況下,我會(huì)服從上級(jí)的意見。” 2、 如果面試你的是總經(jīng)理,而你所應(yīng)聘的職位另有一位經(jīng)理,且這位經(jīng)理當(dāng)時(shí)不在場(chǎng),可以這樣回答:“對(duì)于非原則性問題,我會(huì)服從上級(jí)的意見,對(duì)于涉及公司利益的重大問題,我希望能向更高層領(lǐng)導(dǎo)反映。”
             
              問題十二:“我們?yōu)槭裁匆浻媚悖?#8221;
             
              思路: 1、 應(yīng)聘者最好站在招聘單位的角度來回答。 2、 招聘單位一般會(huì)錄用這樣的應(yīng)聘者:基本符合條件、對(duì)這份共組感興趣、有足夠的信心。 3、 如“我符合貴公司的招聘條件,憑我目前掌握的技能、高度的責(zé)任感和良好的餓適應(yīng)能力及學(xué)習(xí)能力 ,完全能勝任這份工作。我十分希望能為貴 公司服務(wù),如果貴公司給我這個(gè)機(jī)會(huì),我一定能成為貴公司的棟梁!”

              問題十三:“你能為我們做什么?”
             
              思路: 1、 基本原則上“投其所好”。 2、 回答這個(gè)問題前應(yīng)聘者最好能“先發(fā)制人”,了解招聘單位期待這個(gè)職位所能發(fā)揮的作用。 3、 應(yīng)聘者可以根據(jù)自己的了解,結(jié)合自己在專業(yè)領(lǐng)域的優(yōu)勢(shì)來回答這個(gè)問題。
             
              問題十四:“你是應(yīng)屆畢業(yè)生,缺乏經(jīng)驗(yàn),如何能勝任這項(xiàng)工作?”
             
              思路: 1、 如果招聘單位對(duì)應(yīng)屆畢業(yè)生的應(yīng)聘者提出這個(gè)問題,說明招聘單位并不真正在乎“經(jīng)驗(yàn)”,關(guān)鍵看應(yīng)聘者怎樣回答。 2、 對(duì)這個(gè)問題的回答最好要體現(xiàn)出應(yīng)聘者的誠(chéng)懇、機(jī)智、果敢及敬業(yè)。 3、 如“作為應(yīng)屆畢業(yè)生,在工作經(jīng)驗(yàn)方面的確會(huì)有所欠缺,因此在讀書期間我一直利用各種機(jī)會(huì)在這個(gè)行業(yè)里做兼職。我也發(fā)現(xiàn),實(shí)際工作遠(yuǎn)比書本知識(shí)豐富、復(fù)雜。但我有較強(qiáng)的責(zé)任心、適應(yīng)能力和學(xué)習(xí)能力,而且比較勤奮,所以在兼職中均能圓滿完成各項(xiàng)工作,從中獲取的經(jīng)驗(yàn)也令我受益非淺。請(qǐng)貴公司放心,學(xué)校所學(xué)及兼職的工作經(jīng)驗(yàn)使我一定能勝任這個(gè)職位。”

              問題十五:“你希望與什么樣的上級(jí)共事?”
             
              思路: 1、 通過應(yīng)聘者對(duì)上級(jí)的“希望”可以判斷出應(yīng)聘者對(duì)自我要求的意識(shí),這既上一個(gè)陷阱,又上一次機(jī)會(huì)。 2、 最好回避對(duì)上級(jí)具體的希望,多談對(duì)自己的要求。 3、 如“做為剛步入社會(huì)新人,我應(yīng)該多要求自己盡快熟悉環(huán)境、適應(yīng)環(huán)境,而不應(yīng)該對(duì)環(huán)境提出什么要求,只要能發(fā)揮我的專長(zhǎng)就可以了。”
             
              問題十六:“您在前一家公司的離職原因是什么?”
             
              思路: 1、 最重要的是:應(yīng)聘者要使找招聘單位相信,應(yīng)聘者在過往的單位的“離職原因”在此家招聘單位里不存在。 2、 避免把“離職原因”說得太詳細(xì)、太具體。 3、 不能摻雜主觀的負(fù)面感受,如“太幸苦”、“人際關(guān)系復(fù)雜”、“管理太混亂”、“公司不重視人才”、“公司排斥我們某某的員工”等。 4、 但也不能躲閃、回避,如“想換換環(huán)境”、“個(gè)人原因”等。 5、 不能涉及自己負(fù)面的人格特征,如不誠(chéng)實(shí)、懶惰、缺乏責(zé)任感、不隨和等。 6、 盡量使解釋的理由為應(yīng)聘者個(gè)人形象添彩。 7、 如“我離職是因?yàn)檫@家公司倒閉。我在公司工作了三年多,有較深的感情。從去年始,由于市場(chǎng)形勢(shì)突變,公司的局面急轉(zhuǎn)直下。到眼下這一步我覺得很遺憾,但還要面對(duì)顯示,重新尋找能發(fā)揮我能力的舞臺(tái)。” 同一個(gè)面試問題并非只有一個(gè)答案,而同一個(gè)答案并不是在任何面試場(chǎng)合都有效,關(guān)鍵在于應(yīng)聘者掌握了規(guī)律后,對(duì)面試的具體情況進(jìn)行把握,有意識(shí)地揣摩面試官提出問題的心理背景,然后投其所好。
            posted @ 2009-10-02 16:36 life02 閱讀(180) | 評(píng)論 (0)編輯 收藏

            // 編程珠璣 第二章 字符串string循環(huán)移位i位
            // eg "abcdefgh" 循環(huán)移位 3位 =》 "defghabc"
            #include<iostream.h>
            #include 
            <string.h>

            char* string_cyclicshift_v2( char* stringint i )
            {
                
            char ch;
                
            int exchange;
                
            int len;
                
                exchange 
            = 0;
                len 
            = strlen( string );
                
                i 
            = i%len;
                
            if ( 0 == i )
                    
            return string;
                
                
            int start_pos=0;
                
            while ( exchange<len )
                
            {
                    
            char ch = string[start_pos];
                    
                    
            int currpos = start_pos;
                    
            int nextpos = (len+currpos+i)%len;
                    
            while ( nextpos != start_pos )
                    
            {
                        
            string[currpos] = string[nextpos];
                        
            ++exchange;
                        
                        currpos 
            = nextpos;
                        nextpos 
            = (len+currpos+i)%len;

                    }

                     cout
            <<string<<endl;
                    
            string[currpos] = ch;
                    
            ++exchange;
                    
                    
            ++start_pos;
                }

                
                
            return string;
            }


            int main(){
                
            char string[7]={'a','b','h','d','h','s'};
                cout
            <<string<<endl;
                
            char* s;
                s
            =string_cyclicshift_v2(string,4);
                cout
            <<s<<endl;

            return 0;
            }

            要求時(shí)間復(fù)雜度空間復(fù)雜度都盡可能的低。

            時(shí)間復(fù)雜度 O(n), 空間復(fù)雜度O(1),常量時(shí)間。

            http://blog.csdn.net/zdl1016/archive/2009/09/21/4575309.aspx
            posted @ 2009-09-28 23:02 life02 閱讀(1211) | 評(píng)論 (1)編輯 收藏

            #include<iostream.h>
            #define N 13

            void sift(int* a,int low,int high){
                
            int i=low;
                
            int j=2*i;
                
            int temp=a[i];
                
            while(j<=high){
                      
            if (j<high && a[j]<a[j+1])
                      
            {
                          j
            ++;
                      }

                      
            if (temp<a[j])
                      
            {
                          a[i]
            =a[j];
                          i
            =j;
                          j
            =2*i;
                      }
            else
                          
            break;

                }

                a[i]
            =temp;
            }


            void heap_sort(int* a,int n){
               
            int i;
               
            int temp;
               
            for (i=n/2;i>=0;i--)
               
            {
                   sift(a,i,n
            -1);
               }

               
            for (i=n-1;i>0;i--)
               
            {
                   temp
            =a[0];
                   a[
            0]=a[i];
                   a[i]
            =temp;
                   sift(a,
            0,i-1);
               }


            }


            void sort_print(int* a,int n){
              
            for (int i=0;i<n;i++)
              
            {
                  cout
            <<a[i]<<" ";
              }

              cout
            <<endl;

            }


            int main(){

                
            int a[N]={34,34,566,66,77,8,989,6676,12323,89,90,123,4355};
                sort_print(a,N);
                heap_sort(a,N);
                sort_print(a,N);



            }
            posted @ 2009-09-28 22:28 life02 閱讀(240) | 評(píng)論 (0)編輯 收藏

            http://blog.163.com/pcteacher/blog/static/66585815200862183835111/


            算法的力量(轉(zhuǎn)李開復(fù))---適合計(jì)算機(jī)專業(yè)新生

            算法的力量
            2006年5月

            算法是計(jì)算機(jī)科學(xué)領(lǐng)域最重要的基石之一,但卻受到了國(guó)內(nèi)一些程序員的冷落許多學(xué)生看到一些公司在招聘時(shí)要求的編程語言五花八門,就產(chǎn)生了一種誤解,認(rèn)為學(xué)計(jì)算機(jī)就是學(xué)各種編程語言,或者認(rèn)為,學(xué)習(xí)最新的語言技術(shù)標(biāo)準(zhǔn)就是最好的鋪路方法其實(shí),大家被這些公司誤導(dǎo)了編程語言雖然該學(xué),但是學(xué)習(xí)計(jì)算機(jī)算法和理論更重要,因?yàn)橛?jì)算機(jī)語言和開發(fā)平臺(tái)日新月異,但萬變不離其宗的是那些算法和理論,例如數(shù)據(jù)結(jié)構(gòu)算法編譯原理計(jì)算機(jī)體系結(jié)構(gòu)關(guān)系型數(shù)據(jù)庫(kù)原理等等在開復(fù)學(xué)生網(wǎng)上,有位同學(xué)生動(dòng)地把這些基礎(chǔ)課程比擬為內(nèi)功,把新的語言技術(shù)標(biāo)準(zhǔn)比擬為外功整天趕時(shí)髦的人最后只懂得招式,沒有功力,是不可能成為高手的

            算法與我

            當(dāng)我在1980年轉(zhuǎn)入計(jì)算機(jī)科學(xué)系時(shí),還沒有多少人的專業(yè)方向是計(jì)算機(jī)科學(xué)有許多其他系的人嘲笑我們說:知道為什么只有你們系要加一個(gè)科學(xué),而沒有物理科學(xué)系或化學(xué)科學(xué)系嗎?因?yàn)槿思沂钦娴目茖W(xué),不需要畫蛇添足,而你們自己心虛,生怕不科學(xué),才這樣欲蓋彌彰 其實(shí),這點(diǎn)他們徹底弄錯(cuò)了真正學(xué)懂計(jì)算機(jī)的人(不只是編程匠)都對(duì)數(shù)學(xué)有相當(dāng)?shù)脑煸劊饶苡每茖W(xué)家的嚴(yán)謹(jǐn)思維來求證,也能用工程師的務(wù)實(shí)手段來解決問題而這種思維和手段的最佳演繹就是算法

            記得我讀博時(shí)寫的Othello對(duì)弈軟件獲得了世界冠軍當(dāng)時(shí),得第二名的人認(rèn)為我是靠?jī)e幸才打贏他,不服氣地問我的程序平均每秒能搜索多少步棋,當(dāng)他發(fā)現(xiàn)我的軟件在搜索效率上比他快60多倍時(shí),才徹底服輸為什么在同樣的機(jī)器上,我可以多做60倍的工作呢?這是因?yàn)槲矣昧艘粋€(gè)最新的算法,能夠把一個(gè)指數(shù)函數(shù)轉(zhuǎn)換成四個(gè)近似的表,只要用常數(shù)時(shí)間就可得到近似的答案在這個(gè)例子中,是否用對(duì)算法才是能否贏得世界冠軍的關(guān)鍵

            還記得1988年貝爾實(shí)驗(yàn)室副總裁親自來訪問我的學(xué)校,目的就是為了想了解為什么他們的語音識(shí)別系統(tǒng)比我開發(fā)的慢幾十倍,而且,在擴(kuò)大至大詞匯系統(tǒng)后,速度差異更有幾百倍之多他們雖然買了幾臺(tái)超級(jí)計(jì)算機(jī),勉強(qiáng)讓系統(tǒng)跑了起來,但這么貴的計(jì)算資源讓他們的產(chǎn)品部門很反感,因?yàn)榘嘿F的技術(shù)是沒有應(yīng)用前景的在與他們探討的過程中,我驚訝地發(fā)現(xiàn)一個(gè)O(n*m)的動(dòng)態(tài)規(guī)劃(dynamic programming)居然被他們做成了O(n*n*m)更驚訝的是,他們還為此發(fā)表了不少文章,甚至為自己的算法起了一個(gè)很特別的名字,并將算法提名到一個(gè)科學(xué)會(huì)議里,希望能得到大獎(jiǎng)當(dāng)時(shí),貝爾實(shí)驗(yàn)室的研究員當(dāng)然絕頂聰明,但他們?nèi)际菍W(xué)數(shù)學(xué)物理或電機(jī)出身,從未學(xué)過計(jì)算機(jī)科學(xué)或算法,才犯了這么基本的錯(cuò)誤我想那些人以后再也不會(huì)嘲笑學(xué)計(jì)算機(jī)科學(xué)的人了吧!

            網(wǎng)絡(luò)時(shí)代的算法

            有人也許會(huì)說:今天計(jì)算機(jī)這么快,算法還重要嗎?其實(shí)永遠(yuǎn)不會(huì)有太快的計(jì)算機(jī),因?yàn)槲覀兛倳?huì)想出新的應(yīng)用雖然在摩爾定律的作用下,計(jì)算機(jī)的計(jì)算能力每年都在飛快增長(zhǎng),價(jià)格也在不斷下降可我們不要忘記,需要處理的信息量更是呈指數(shù)級(jí)的增長(zhǎng)現(xiàn)在每人每天都會(huì)創(chuàng)造出大量數(shù)據(jù)(照片,視頻,語音,文本等等)日益先進(jìn)的記錄和存儲(chǔ)手段使我們每個(gè)人的信息量都在爆炸式的增長(zhǎng)互聯(lián)網(wǎng)的信息流量和日志容量也在飛快增長(zhǎng)在科學(xué)研究方面,隨著研究手段的進(jìn)步,數(shù)據(jù)量更是達(dá)到了前所未有的程度無論是三維圖形海量數(shù)據(jù)處理機(jī)器學(xué)習(xí)語音識(shí)別,都需要極大的計(jì)算量在網(wǎng)絡(luò)時(shí)代,越來越多的挑戰(zhàn)需要靠卓越的算法來解決

            再舉另一個(gè)網(wǎng)絡(luò)時(shí)代的例子在互聯(lián)網(wǎng)和手機(jī)搜索上,如果要找附近的咖啡店,那么搜索引擎該怎么處理這個(gè)請(qǐng)求呢?

            最簡(jiǎn)單的辦法就是把整個(gè)城市的咖啡館都找出來,然后計(jì)算出它們的所在位置與你之間的距離,再進(jìn)行排序,然后返回最近的結(jié)果但該如何計(jì)算距離呢?圖論里有不少算法可以解決這個(gè)問題

            這么做也許是最直觀的,但絕對(duì)不是最迅速的如果一個(gè)城市只有為數(shù)不多的咖啡館,那這么做應(yīng)該沒什么問題,反正計(jì)算量不大但如果一個(gè)城市里有很多咖啡館,又有很多用戶都需要類似的搜索,那么服務(wù)器所承受的壓力就大多了在這種情況下,我們?cè)撛鯓觾?yōu)化算法呢?

            首先,我們可以把整個(gè)城市的咖啡館做一次預(yù)處理比如,把一個(gè)城市分成若干個(gè)格子(grid),然后根據(jù)用戶所在的位置把他放到某一個(gè)格子里,只對(duì)格子里的咖啡館進(jìn)行距離排序

            問題又來了,如果格子大小一樣,那么絕大多數(shù)結(jié)果都可能出現(xiàn)在市中心的一個(gè)格子里,而郊區(qū)的格子里只有極少的結(jié)果在這種情況下,我們應(yīng)該把市中心多分出幾個(gè)格子更進(jìn)一步,格子應(yīng)該是一個(gè)樹結(jié)構(gòu),最頂層是一個(gè)大格整個(gè)城市,然后逐層下降,格子越來越小,這樣有利于用戶進(jìn)行精確搜索如果在最底層的格子里搜索結(jié)果不多,用戶可以逐級(jí)上升,放大搜索范圍

            上述算法對(duì)咖啡館的例子很實(shí)用,但是它具有通用性嗎?答案是否定的把咖啡館抽象一下,它是一個(gè)點(diǎn),如果要搜索一個(gè)面該怎么辦呢?比如,用戶想去一個(gè)水庫(kù)玩,而一個(gè)水庫(kù)有好幾個(gè)入口,那么哪一個(gè)離用戶最近呢?這個(gè)時(shí)候,上述樹結(jié)構(gòu)就要改成r-tree,因?yàn)闃渲虚g的每一個(gè)節(jié)點(diǎn)都是一個(gè)范圍,一個(gè)有邊界的范圍(參考:http://www.cs.umd.edu/~hjs/rtrees/index.html

            通過這個(gè)小例子,我們看到,應(yīng)用程序的要求千變?nèi)f化,很多時(shí)候需要把一個(gè)復(fù)雜的問題分解成若干簡(jiǎn)單的小問題,然后再選用合適的算法和數(shù)據(jù)結(jié)構(gòu)

            并行算法:Google的核心優(yōu)勢(shì)

            上面的例子在Google里就要算是小case了!每天Google的網(wǎng)站要處理十億個(gè)以上的搜索,GMail要儲(chǔ)存幾千萬用戶的2G郵箱,Google Earth要讓數(shù)十萬用戶同時(shí)在整個(gè)地球上遨游,并將合適的圖片經(jīng)過互聯(lián)網(wǎng)提交給每個(gè)用戶如果沒有好的算法,這些應(yīng)用都無法成為現(xiàn)實(shí)

            在這些的應(yīng)用中,哪怕是最基本的問題都會(huì)給傳統(tǒng)的計(jì)算帶來很大的挑戰(zhàn)例如,每天都有十億以上的用戶訪問Google的網(wǎng)站,使用Google的服務(wù),也產(chǎn)生很多很多的日志(Log)因?yàn)長(zhǎng)og每分每秒都在飛速增加,我們必須有聰明的辦法來進(jìn)行處理我曾經(jīng)在面試中問過關(guān)于如何對(duì)log進(jìn)行一些分析處理的問題,有很多面試者的回答雖然在邏輯上正確,但在實(shí)際應(yīng)用中是幾乎不可行的按照他們的算法,即便用上幾萬臺(tái)機(jī)器,我們的處理速度都跟不上數(shù)據(jù)產(chǎn)生的速度

            那么Google是如何解決這些問題的呢?

            首先,在網(wǎng)絡(luò)時(shí)代,就算有最好的算法,也要能在并行計(jì)算的環(huán)境下執(zhí)行在Google的數(shù)據(jù)中心,我們使用的是超大的并行計(jì)算機(jī)但傳統(tǒng)的并行算法運(yùn)行時(shí),效率會(huì)在增加機(jī)器數(shù)量后迅速降低,也就是說,十臺(tái)機(jī)器如果有五倍的效果,增加到一千臺(tái)時(shí)也許就只有幾十倍的效果這種事倍功半的代價(jià)是沒有哪家公司可以負(fù)擔(dān)得起的而且,在許多并行算法中,只要一個(gè)結(jié)點(diǎn)犯錯(cuò)誤,所有計(jì)算都會(huì)前功盡棄

            那么Google是如何開發(fā)出既有效率又能容錯(cuò)的并行計(jì)算的呢?

            Google最資深的計(jì)算機(jī)科學(xué)家Jeff Dean認(rèn)識(shí)到, Google 所需的絕大部分?jǐn)?shù)據(jù)處理都可以歸結(jié)為一個(gè)簡(jiǎn)單的并行算法:Map and Reduce(http://labs.google.com/papers/mapreduce.html) 這個(gè)算法能夠在很多種計(jì)算中達(dá)到相當(dāng)高的效率,而且是可擴(kuò)展的(也就是說,一千臺(tái)機(jī)器就算不能達(dá)到一千倍的效果,至少也可以達(dá)到幾百倍的效果)Map and Reduce的另外一大特色是它可以利用大批廉價(jià)的機(jī)器組成功能強(qiáng)大的server farm最后,它的容錯(cuò)性能異常出色,就算一個(gè)server farm里面的機(jī)器down掉一半,整個(gè)farm依然能夠運(yùn)行正是因?yàn)檫@個(gè)天才的認(rèn)識(shí),才有了Map and Reduce算法借助該算法,Google幾乎能無限地增加計(jì)算量,與日新月異的互聯(lián)網(wǎng)應(yīng)用一同成長(zhǎng)

            算法并不局限于計(jì)算機(jī)和網(wǎng)絡(luò)

            舉一個(gè)計(jì)算機(jī)領(lǐng)域外的例子:在高能物理研究方面,很多實(shí)驗(yàn)每秒鐘都產(chǎn)生幾個(gè)TB的數(shù)據(jù)量但因?yàn)樘幚砟芰痛鎯?chǔ)能力的不足,科學(xué)家不得不把絕大部分未經(jīng)處理的數(shù)據(jù)丟棄掉可大家要知道,新元素的信息很有可能就藏在我們來不及處理的數(shù)據(jù)里面同樣的,在其他任何領(lǐng)域里,算法都可以改變?nèi)祟惖纳罾缛祟惢虻难芯浚涂赡芤驗(yàn)樗惴ǘl(fā)明新的醫(yī)療方式在國(guó)家安全領(lǐng)域,有效的算法可能避免下一個(gè)911的發(fā)生在氣象方面,算法可以更好地預(yù)測(cè)未來天災(zāi)的發(fā)生,以拯救生命

            所以,如果你把計(jì)算機(jī)的發(fā)展放到應(yīng)用和數(shù)據(jù)飛速增長(zhǎng)的大環(huán)境下,你一定會(huì)發(fā)現(xiàn),算法的重要性不是在日益減小,而是在日益加強(qiáng)

            給程序員的七個(gè)建議

            (1)練內(nèi)功不要只花功夫?qū)W習(xí)各種流行的編程語言和工具,以及某些公司招聘廣告上要求的科目要把數(shù)據(jù)結(jié)構(gòu)算法數(shù)據(jù)庫(kù)操作系統(tǒng)原理計(jì)算機(jī)體系結(jié)構(gòu)計(jì)算機(jī)網(wǎng)絡(luò),離散數(shù)學(xué)等基礎(chǔ)課程學(xué)好大家不妨試試高德納所著The Art of Computer Programming里的題目,如果你能夠解決其中的大部分題目,就說明你在算法方面有一定的功力了

            (2)多實(shí)戰(zhàn)通過編程的實(shí)戰(zhàn)積累經(jīng)驗(yàn)鞏固知識(shí)很多中國(guó)大學(xué)畢業(yè)生缺乏編程和調(diào)試經(jīng)驗(yàn);學(xué)習(xí)C語言,考試過關(guān)就算學(xué)會(huì)了;課題項(xiàng)目中,只要程序能夠編譯,運(yùn)行,并且輸入輸出滿足要求就算了事這些做法是不行的寫程序的時(shí)候,大家必須多想想如何把程序?qū)懙酶泳珶捀咝Ц哔|(zhì)量建議大家爭(zhēng)取在大學(xué)四年中積累編寫十萬行代碼的經(jīng)驗(yàn)我們必須明白的是:好程序員是寫出來的,不是學(xué)出來的

            (3)求實(shí)干不要輕視任何實(shí)際工作,比如一些看似簡(jiǎn)單的編碼或測(cè)試要不懈追求對(duì)細(xì)節(jié)一絲不茍的實(shí)干作風(fēng)與敬業(yè)精神我發(fā)現(xiàn)不少程序員對(duì)于知識(shí)的掌握很膚淺,不求甚解,沒有好奇心,不會(huì)刨根問底比如,學(xué)會(huì)了C++,是否了解一個(gè)對(duì)象在編譯后,在匯編代碼中是如何被初始化的?這個(gè)對(duì)象的各個(gè)成員在內(nèi)存中是如何存放的?當(dāng)一個(gè)成員函數(shù)被調(diào)用時(shí),編譯器在匯編代碼中加入了哪些額外的動(dòng)作?虛函數(shù)的調(diào)用是如何實(shí)現(xiàn)的? 這些東西恐怕在編程語言或編譯原理中都沒有詳細(xì)提到,只有通過踏實(shí)的實(shí)干才能真正掌握

            (4)重視數(shù)學(xué)學(xué)習(xí)數(shù)學(xué)是思維的體操,數(shù)學(xué)無處不在學(xué)計(jì)算機(jī)至少要學(xué)習(xí)離散數(shù)學(xué)概率論布爾代數(shù)集合論和數(shù)理邏輯這些知識(shí)并不難,但是對(duì)你未來的工作幫助會(huì)很大 尤其當(dāng)你對(duì)一些數(shù)學(xué)密集型的領(lǐng)域如視頻圖像處理等有興趣時(shí),這些知識(shí)將成為你手中的利器

            (5)培養(yǎng)團(tuán)隊(duì)精神,學(xué)會(huì)與人合作今天的軟件工程早已經(jīng)不是一個(gè)人可以單獨(dú)操作的,而必須靠團(tuán)隊(duì)合作才能成功不懂得合作的人是不能成大器的大家要多去尋找可以與人一起做項(xiàng)目的機(jī)會(huì)

            (6)激勵(lì)創(chuàng)新意識(shí),培養(yǎng)好奇心,不要死記硬背沒有掌握某種算法技術(shù)的根本原理,就不會(huì)有應(yīng)變和創(chuàng)新的能力想成為一位好程序員(其實(shí)從事任何一個(gè)行業(yè)都是如此),重要的是要養(yǎng)成鉆研,好奇,創(chuàng)新,動(dòng)手,合作的優(yōu)秀習(xí)慣,不滿足于填鴨,不滿足于考試交差,不滿足于表象這不是學(xué)幾門課能夠一蹴而就的

            (7)有策略地打工在不影響學(xué)業(yè)的前提下,尋找真正有意義的暑期工作或兼職去找一個(gè)重視技術(shù)的公司,在一個(gè)好的老板指導(dǎo)下完成真正會(huì)被用戶使用的程序不要急于去一個(gè)要你做頭而獨(dú)擋一面的地方,因?yàn)橄騽e人學(xué)習(xí)才是你的目的找工作也是一樣,不要只看待遇和職銜,要挑一個(gè)你能夠?qū)W習(xí)的環(huán)境,一個(gè)愿意培養(yǎng)員工的企業(yè),一個(gè)重視你的專業(yè)的公司最后,還要挑一個(gè)好老板

            希望大家都能把握機(jī)會(huì),養(yǎng)成好的學(xué)習(xí)習(xí)慣,把算法學(xué)精學(xué)透;希望大家都能有一個(gè)美好的未來!

             該回復(fù)于2008-05-14 08:25:19被管理員刪除  The Art of Computer Programming Vol.1 (中文譯作計(jì)算機(jī)編程的藝術(shù)計(jì)算機(jī)程序設(shè)計(jì)技巧)--Basic Algorithms(基礎(chǔ)算法)

            這部書被譽(yù)為20世紀(jì)最重要的20部著作之一,與Einstein的相對(duì)論并列,使計(jì)算機(jī)科學(xué)領(lǐng)域的權(quán)威著作全書共分5卷,目前已經(jīng)出版了3卷,這是它的第一卷基礎(chǔ)算法,包含了我們常用的算法及其相關(guān)數(shù)據(jù)結(jié)構(gòu)作者高德納(Donald E. Knuth)是美國(guó)Stanford大學(xué)計(jì)算機(jī)科學(xué)系的退休教授,在計(jì)算機(jī)科學(xué)領(lǐng)域享有崇高的威望 


            本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/zdl1016/archive/2009/09/27/4602750.aspx

            posted @ 2009-09-28 09:47 life02 閱讀(267) | 評(píng)論 (0)編輯 收藏

            http://student.csdn.net/space.php?uid=32341&do=blog&id=1716

             1#include <stdio.h>    
             2int main(void)    
             3{    
             4    int n, nSum=1;// nSum 保存總和    
             5    scanf("%d"&n);// 輸入要分解的n    
             6    for(int n1=1, n2=n1; n1<=n/2; )// n1為最開頭的數(shù),n2是最末尾    
             7    {    
             8        if(nSum<n)      //總和偏小    
             9        {    
            10            n2++;       //末尾加數(shù)    
            11            nSum+=n2;    
            12        }
                
            13        else if(nSum>n) //總和偏大    
            14        {    
            15            nSum -= n1; //開頭刪數(shù)    
            16            n1++;    
            17        }
                
            18        else //if(nSum==n) //相等就輸出結(jié)果    
            19        {    
            20            for(int t=n1; t<=n2; t++)    
            21            {    
            22                printf("%d,", t);    
            23            }
                
            24            printf("\n");    
            25            n2++;       //末尾加數(shù),如果不加就會(huì)死循環(huán)    
            26            nSum+=n2;   //這步要小心    
            27        }
                
            28    }
                
            29    return 0;    
            30}
                
            31

            問題:還有更快的辦法嗎?請(qǐng)仔細(xì)觀察第一段代碼,看得出哪個(gè)特點(diǎn)可以利用不?

            關(guān)鍵就在那個(gè)通項(xiàng)公式,(n1+n2)*(n2-n1+1) == n*2
            這里如果先把n乘以2,然后的問題可不可以看成是因子分解?答案很明顯。
            假如分解出的結(jié)果是n*2 = a*b ,
            那就解方程組 n1+n2=a, n2-n1+1=b
            即n1=(a-b+1)/2, n2=(a+b-1)/2
            如果解出的結(jié)果n1和n2是整數(shù)的話(即要使a和b一奇一偶),顯然就得到一組解了
            而因子分解的復(fù)雜度是O(sqrt(n)),顯示會(huì)比之前第二段代碼要節(jié)省非常多的時(shí)間。

            posted @ 2009-09-28 09:03 life02 閱讀(608) | 評(píng)論 (1)編輯 收藏

            http://www.cnblogs.com/cgwolver/archive/2009/03/26/1257611.html
            假定在右手坐標(biāo)系中的三角形3點(diǎn)坐標(biāo)為A,B,C,判斷P是否在ABC之內(nèi)

            ( 主要來自 3D引擎研發(fā)QQ群(38224573 )的各位朋友的討論 ,我僅僅算做個(gè)總結(jié)吧,特別感謝各位朋友的熱情支持。 )

            方法1:三個(gè)Perplane的方法

                       設(shè)AB,BC,AC邊上的垂直平面為Perplane[3],垂直朝向內(nèi)側(cè)的法向?yàn)閚[3]

                      1)先根據(jù)任意兩邊叉出法向N

                           N = AB.CrossProduct(AC);

                           N.Normalize();

                           D = A.DotProduct( N );

                      2)如果P在三角形所在平面之外,可直接判定不在平面之內(nèi)( 假定方程為 ax+by+cz+d = 0 )

                           if( P.DotProduct( N ) + D > 0 ) return false;

                      3)然后法向和各邊叉出垂直平面的法向

                           n[0] = N.CrossProduct(AB); //朝向內(nèi)側(cè)

                           n[0].Normalize();

                           Perplane[0].dist = A.DotProduct(n[0]);

                           Perplane[0].normal = n[0];

                           同樣方法求得Perplane[1],Perlane[2];

                      3)因?yàn)槿齻€(gè)Perplane都朝向三角形內(nèi)側(cè),P在三角形內(nèi)的條件是同時(shí)在三個(gè)Perplane前面;如果給定點(diǎn)P在任意一個(gè)垂直平面之后,那么可判定P在三角形外部

                           for( int i = 0;i<3;j++ )

                           {

                                if( P.DotProduct( Perplane[i].normal ) + Perplane[i].dist < 0 )

                                     return false;

                           }

                           return true;//如果P沒有在任意一條邊的外面,可判斷定在三角形之內(nèi),當(dāng)然包括在邊上的情況

            方法2:三個(gè)部分面積與總面積相等的方法

                      S(PAB) + S(PAC) + S( PBC) = S(ABC) 則判定在三角形之內(nèi)

                      用矢量代數(shù)方法計(jì)算三角形的面積為

                           S = 1/2*|a|*|b|*sin(theta)

                              = 1/2*|a|*|b|*sqrt(1-cos^2(theta))

                              = 1/2*|a|*|b|*sqrt(1- (a.DotProduct(b)/(|a|*|b|))^2);

                           另一種計(jì)算面積的方法是 S = 1/2*|a.CrossProduct(b)|

                           比較一下,發(fā)現(xiàn)后者的精確度和效率都高于前者,因?yàn)榍罢咝枰_方和求矢量長(zhǎng)度,矢量長(zhǎng)度相當(dāng)于一次點(diǎn)乘,三個(gè)點(diǎn)乘加一個(gè)開方,顯然不如

                           后者一次叉乘加一次矢量長(zhǎng)度(注,一次叉乘計(jì)算相當(dāng)于2次點(diǎn)乘,一次矢量長(zhǎng)度計(jì)算相當(dāng)于一次點(diǎn)乘),后者又對(duì)又快。

                           

                           S(ABC)  = AB.CrossProduct(AC);//*0.5;

                           S(PAB)  = PA.CrossProduct(PB);//*0.5;

                           S(PBC)  = PB.CrossProduct(PC);//*0.5;

                           S(PAC)  = PC.CrossProduct(PA);//*0.5;

                           if( S(PAB) + S(PBC) + S(PAC) == S(ABC)  )

                                return true;

                           return false;

                     

                    另一種計(jì)算三角形面積的矢量方法是 1/2*a.CrossProdcuct(b) ,CrossProduct = ( y1*z2 - y2*z1 , x1*z2 - x2*z1, x1*y2 - x2*z1 )

                           可以看到CrossProduct 的計(jì)算要比DotProduct多3個(gè)乘法計(jì)算,效率沒有上面的方法高


            方法3:三個(gè)向量歸一化后相加為0

                    這個(gè)方法很怪異,發(fā)現(xiàn)自http://flipcode.spaces.live.com/blog/cns!8e578e7901a88369!903.entry 下面的一個(gè)回帖

                             
                          

                      如上圖三角形ABC,P為AB外側(cè)一點(diǎn),N1,N2,N3 分別為BP,AP,CP的歸一化矢量;NM為N1,N2夾角的角平分線

                      可以看出角A-P-B是三角形內(nèi)角,必然小于180度,那么角N1-P-N2等于A-P-B;NM是N1-P-N2的角平分線,那么角B-P-N等于角N-P-A,而CPN必然小于其中一個(gè),

                      即小于180/2 = 90度。結(jié)論是角N1,N2的合矢量方向與N3的夾角為銳角。所以N1,N2,N3的合向量模大于1.

                      這里注意,N3不一定在N1,N2之間,不能假定N2-P-N3 和N3-P-N1這兩個(gè)角一定是銳角

                      同樣可以推導(dǎo)出如果P在三角形內(nèi),N1+N2+N3必然小于0;若N1+N2+N3 = 0則P在三角形的邊上。

                      有沒有更簡(jiǎn)單的推導(dǎo)方法?

                     

                      這個(gè)方法看起來很精巧,但是善于優(yōu)化的朋友會(huì)立刻發(fā)現(xiàn),三個(gè)矢量歸一化,需要三個(gè)開方。迭代式開方太慢了,而快速開方有的時(shí)候又不滿足精度要求。

                             

             方法4:重心坐標(biāo)之和為1

                     {

                           BaryCenter = ( S(PAB)/S(PABC),S(PBC)/S(PABC),S(PAC)/S(PABC)) // 點(diǎn)P在三角形內(nèi)的重心坐標(biāo)

                     

                           if( BaryCenter.x + BaryCenter.y + BaryCenter.z >0.f )

                                return false

                           return true;

                      }

                      其中S(PAB),S(ABC),S(PBC),S(PBC) 用上述的方法二種提到的計(jì)算三角形面積方法計(jì)算。

            綜合比較

                 方法1必須求叉乘,雖然可以通過首先排除不在平面內(nèi)的點(diǎn),但是后面仍要求三個(gè)叉乘和3個(gè)點(diǎn)乘(當(dāng)然還可排除法優(yōu)化)

                 方法2看起來之需要求4個(gè)點(diǎn)乘,如果用叉乘方法計(jì)算面積,可能會(huì)導(dǎo)致效率低下

                 方法3是看起來是最精巧的方法,但是效率也不能保證...3個(gè)開方

                 方法4和方法2的效率差不多

             

            本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/boyzk2008/archive/2009/08/07/4421106.aspx

            posted @ 2009-09-25 10:22 life02 閱讀(1630) | 評(píng)論 (8)編輯 收藏

            一.  單選題(每題4分,15題,共60分)

              1.考慮函數(shù)原型void hello(int a,int b=7,char* pszC="*"),下面的函數(shù)調(diào)用鐘,屬于不合法調(diào)用的是:

              A hello(5)     B.hello(5,8)     C.hello(6,"#")     D.hello(0,0,"#")

              2.下面有關(guān)重載函數(shù)的說法中正確的是:

              A.重載函數(shù)必須具有不同的返回值類型   B.重載函數(shù)形參個(gè)數(shù)必須不同

              C.重載函數(shù)必須有不同的形參列表       D.重載函數(shù)名可以不同

              3.分析一下程序的運(yùn)行結(jié)果:

              #include<iostream.h>

              class CBase

              {

              public:

              CBase(){cout<<”constructing CBase class”<<endl;}

              ~CBase(){cout<<”destructing CBase class”<<endl;}

              };

              class CSub : public CBase

              {

              public:

              CSub(){cout<<”constructing CSub class”<<endl;}

              ~CSub(){cout<<”destructing CSub class”<<endl;}

              };

              void main()

              {

              CSub obj;

              }

              A. constructing CSub class           B. constructing CBase class

              constructing CBase class             constructing CSub class

              destructing CSub class               destructing CBase class

              destructing CBase class              destructing CSub class

              C. constructing CBase class

              constructing CSub class

              destructing CSub class

              destructing CBase class

              D. constructing CSub class

              constructing CBase class

              destructing CBase class

              destructing CSub class

              4.在一個(gè)cpp文件里面,定義了一個(gè)static類型的全局變量,下面一個(gè)正確的描述是:

              A.只能在該cpp所在的編譯模塊中使用該變量

              B.該變量的值是不可改變的

              C.該變量不能在類的成員函數(shù)中引用

              D.這種變量只能是基本類型(如int,char)不能是C++類型

              5.觀察下面一段代碼:

              class ClassA

              {

              public:

              virtual ~ ClassA(){};

              virtual void FunctionA(){};

              };

              class ClassB

              {

              public:

              virtual void FunctionB(){};

              };

              class ClassC : public ClassA,public ClassB

              {

              public:

              };

              ClassC aObject;

              ClassA* pA=&aObject;

              ClassB* pB=&aObject;

              ClassC* pC=&aObject;

              關(guān)于pA,pB,pC的取值,下面的描述中正確的是:

              A.pA,pB,pC的取值相同.               B.pC=pA+pB

              C.pA和pB不相同                      D.pC不等于pA也不等于pB

              6.參照1.5的代碼,假設(shè)定義了ClassA* pA2,下面正確的代碼是:

              A.pA2=static_cast<ClassA*>(pB);

              B.void* pVoid=static_cast<void*>(pB);

              pA2=static_cast<ClassA*>(pVoid);

              C.pA2=pB;

              D.pA2=static_cast<ClassA*>(static_cast<ClassC*>(pB));

              7.參照1.5的代碼,下面那一個(gè)語句是不安全的:

              A.delete pA   B.delete pB   C.delete pC

              8.下列程序的運(yùn)行結(jié)果為:

              #include<iostream.h>

              void main()

              {

              int a=2;

              int b=++a;

              cout<<a/6<<endl;

              }

              A.0.5   B.0   C0.7   D.0.6666666-

              9.有如下一段代碼:

              #define ADD(x,y) x+y

              int m=3;

              m+=m*ADD(m,m);

              則m的值為:

              A.15   B.12   C.18   D.58

              10.如下是一個(gè)帶權(quán)的圖,圖中結(jié)點(diǎn)A到結(jié)點(diǎn)D的關(guān)鍵路徑的長(zhǎng)度是:

              A.13       B.15       C.28       D.58

              11.下面的模板聲明中,正確的是:

              A.template<typename T1,T2>

              B.template<class T1,T2>

              C.template<class T1,class T2>

              D.template<typename T1;typename T2>

              12.在Windows編程中下面的說法正確的是:

              A.兩個(gè)窗口,他們的窗口句柄可以是相同的     B.兩個(gè)窗口,他們的處理函數(shù)可以是相同的

              C.兩個(gè)窗口,他們的窗口句柄和窗口處理函數(shù)都不可以相同.

              13.下面哪種情況下,B不能隱式轉(zhuǎn)換為A?

              A.class B:public A{}                 B.class A:public B{}
            C.class B{operator A();}             D.class A{A(const B&);}

              14.某公司使用包過濾防火墻控制進(jìn)出公司局域網(wǎng)的數(shù)據(jù),在不考慮使用代理服務(wù)器的情況下,下面描述錯(cuò)誤的是”該防火墻能夠(   )”.

              A.使公司員工只能訪問Internet上與其業(yè)務(wù)聯(lián)系的公司的IP地址.

              B.僅允許HTTP協(xié)議通過,不允許其他協(xié)議通過,例如TCP/UDP.

              C.使員工不能直接訪問FTP服務(wù)器端口號(hào)為21的FTP地址.

              D.僅允許公司中具有某些特定IP地址的計(jì)算機(jī)可以訪問外部網(wǎng)絡(luò)

              15.數(shù)字字符0的ASCII值為48,若有以下程序:

              main()

              {

              char a=’1’,b=’2’;

              printf(“%c,”,b++);

              printf(“%d\n”,b-a);

              }

              程序運(yùn)行之后的輸出結(jié)果是:

              A.3,2      B.50,2       C.2,2     D.2,50

              二.  填空題(共40分)

              本程序從正文文件text.in讀入一篇英文短文,統(tǒng)計(jì)該短文中不同單詞和它的出現(xiàn)次數(shù),并按詞典編輯順序?qū)卧~及它的出現(xiàn)次數(shù)輸出到正文文件word.out中.

              程序用一棵有序二叉樹存儲(chǔ)這些單詞及其出現(xiàn)的次數(shù),一邊讀入一邊建立.然后中序遍歷該二叉樹,將遍歷經(jīng)過的二叉樹上的節(jié)點(diǎn)的內(nèi)容輸出.
            程序中的外部函數(shù)

              int getword(FILE* pFile,char* pszWordBuffer,int nBufferLen);

              從與pFile所對(duì)應(yīng)的文件中讀取單詞置入pszWordBuffer,并返回1;若單詞遇文件尾,已無單詞可讀時(shí),則返回0.

              #include <stdio.h>

              #include <malloc.h>

              #include <ctype.h>

              #include <string.h>

              #define SOURCE_FILE "text.in"

              #define OUTPUT_FILE "word.out"

              #define MAX_WORD_LEN 128

              typedef struct treenode

              {

              char szWord[MAX_WORD_LEN];

              int nCount;

              struct treenode* pLeft;

              struct treenode* pRight;

              }BNODE;

              int getword(FILE* pFile,char* pasWordBuffer,int nBufferLen);

              void binary_tree(BNODE** ppNode,char* pszWord)

              {

              if(ppNode != NULL && pszWord != NULL)

              {

              BNODE* pCurrentNode = NULL;

              BNODE* pMemoNode = NULL;

              int nStrCmpRes=0;

              ____(1)_____;pCurrentNode=*ppNode

              while(pCurrentNode)

              {

              /*尋找插入位置*/

              nStrCmpRes = strcmp(pszWord, ___(2)___ );pCurrentNode->nCount

              if(!nStrCmpRes)

              {

              ___(3)___; pCurrentNode->nCount++

              return;

              }

              else

              {

              ___(4)___; pMemoNode=pCurrentNode

              pCurrentNode = nStrCmpRes>0? pCurrentNode->pRight : pCurrentNode->pLeft;

              }

              }

              }

              pCurrent=new BNODE;

              if(pCurrentNode != NULL)

              {

              memset(pCurrentNode,0,sizeof(BNODE));

              strncpy(pCurrentNode->szWord,pszWord,MAX_WORD_LEN-1);

              pCurrentNode->nCount=1;

              }

              if(pMemoNode==NULL)

              {

              ___(5)___; *ppNode= pCurrentNode

              }

              else if(nStrCmpRes>0)

              {

              pMemoNode->pRight=pCurrentNode;

              }

              else

              {

              pMemoNode->pLeft=pCurrentNode;

              }

              }

              void midorder(FILE* pFile,BNODE* pNode)

              {

              if(___(6)___) return;!pNode||!pFile

              midorder(pFile,pNode->pLeft);

              fprintf(pFile,"%s %d\n",pNode->szWord,pNode->nCount);

              midorder(pFile,pNode->pRight);

              }

              void main()

              {

              FILE* pFile=NULL;

              BNODE* pRootNode=NULL;

              char szWord[MAX_WORD_LEN]={0};

              pFile=fopen(SOURCE_FILE,"r");

              if(pFile==NULL)

              {

              printf("Can't open file %s\n",SOURCE_FILE);

              return;

              }

              while(getword(pFile,szWord,MAX_WORD_LEN)==1)

              {

              binary_tree(___(7)___);// pRootNode,szWord

              }

              fclose(pFile);

              pFile=fopen(OUTPUT_FILE,"w");

              midorder(pFile,pRootNode);

              fclose(pFile);

              }

              三.  附加題(每題30分,2題,共60分)

              1.      從程序健壯性進(jìn)行分析,下面的FillUserInfo函數(shù)和Main函數(shù)分別存在什么問題?

              #include <iostream>

              #include <string>

              #define MAX_NAME_LEN 20

              struct USERINFO

              {

              int nAge;

              char szName[MAX_NAME_LEN];

              };

              void FillUserInfo(USERINFO* parUserInfo)

              {

              stu::cout<<"請(qǐng)輸入用戶的個(gè)數(shù):";

              int nCount=0;

              std::cin>>nCount;

              for(int i=0;i<nCount;i++)

              {

              std::cout<<"請(qǐng)輸入年齡:";

              std::cin>>parUserInfo[i]->nAge;

              std::string strName;
            std::cout<<"請(qǐng)輸入姓名:";

              std::cin>>strName;

              strcpy(parUserInfo[i].szName,strName.c_str());

              }

              }

              int main(int argc,char* argv[])

              {

              USERINFO arUserInfos[100]={0};

              FillUserInfo(arUserInfos);

              printf("The first name is:");

              printf(arUserInfos[0].szName);

              printf("\n");

              return 0;

              }

              2.      假設(shè)你在編寫一個(gè)使用多線程技術(shù)的程序,當(dāng)程序中止運(yùn)行時(shí),需要怎樣一個(gè)機(jī)制來安全有效的中止所有的線程?請(qǐng)描述其具體流程.


            posted @ 2009-09-23 20:50 life02 閱讀(547) | 評(píng)論 (0)編輯 收藏

            #include <iostream>
            using namespace std;

            typedef 
            struct node{
                
            int key;
                
            int data;
                
            struct node *lchild,*rchild;
            }
            ;

            node
            * bt=NULL;

            int insertbst(node *&p,int k){
                
            if (p==NULL)
                
            {
                    p
            =(node*)malloc(sizeof(node));
                    p
            ->key=k;
                    p
            ->lchild=p->rchild=NULL;
                    
            return 1;
                }

                
            else if (k==p->key)
                
            {
                    
            return 0;
                }
            else if (k<p->key)
                
            {
                    
            return insertbst(p->lchild,k);
                }
            else
                
            {
                    
            return insertbst(p->rchild,k);
                }

            }


            node
            * creatbst(int* a,int n){
                
                
            int i=0;
                
            while(i<n){
                    insertbst(bt,a[i]);
                    
            ++i;
                }

                
            return bt;
            }


            void preorder(node* bt){
                
            if (bt!=NULL)
                
            {
                    cout
            <<bt->key<<endl;
                    preorder(bt
            ->lchild);
                    preorder(bt
            ->rchild);
                }

            }




            int main(){
                
            int a[5]={12,3,4,8,10};
                node
            * bl=new node();
                bl
            =creatbst(a,5);
                preorder(bt);

                
            return 0;
            }
            posted @ 2009-09-21 22:46 life02 閱讀(154) | 評(píng)論 (0)編輯 收藏

            http://blog.csdn.net/robinfoxnan/archive/2008/07/25/2712030.aspx
            1. 簡(jiǎn)單實(shí)現(xiàn)
            如果不管效率,最簡(jiǎn)單的實(shí)現(xiàn)只需要4行代碼:

            1 size_t strlen_a(const char * str) {
            2     size_t length = 0 ;
            3     while (*str++ )
            4         ++ length;
            5     return  length;
            6 }
            也許可以稍加改進(jìn)如下:


            1 size_t strlen_b(const char * str) {
            2     const char *cp =  str;
            3     while (*cp++ )
            4          ;
            5     return (cp - str - 1 );
            6 }

            本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/robinfoxnan/archive/2008/07/25/2712030.aspx

            posted @ 2009-09-21 22:18 life02 閱讀(375) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共20頁: First 12 13 14 15 16 17 18 19 20 
            秋霞久久国产精品电影院| 欧美色综合久久久久久| 嫩草伊人久久精品少妇AV| 国产亚洲综合久久系列| 久久久久国产精品| 国产亚洲精午夜久久久久久| 99久久精品国产综合一区| 国内精品久久久久伊人av| 久久夜色精品国产www| 久久99精品免费一区二区| 狠狠色丁香婷综合久久| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 欧美国产精品久久高清| 久久久久久久精品妇女99| 久久精品一本到99热免费| 久久人人爽人人人人爽AV| 久久午夜电影网| 国内精品伊人久久久影院| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久精品国产亚洲AV无码麻豆| 91精品国产高清久久久久久io | 久久综合久久自在自线精品自| 91久久国产视频| 青青草国产成人久久91网| 亚洲&#228;v永久无码精品天堂久久| 精品多毛少妇人妻AV免费久久 | 99久久国产宗和精品1上映| 无码人妻久久久一区二区三区| 一本一道久久a久久精品综合| 国产日韩久久免费影院| 大蕉久久伊人中文字幕| 久久综合九色综合97_久久久| 久久九九精品99国产精品| 亚洲香蕉网久久综合影视| 亚洲日本va中文字幕久久| www.久久热.com| 很黄很污的网站久久mimi色 | 久久久亚洲AV波多野结衣| 99久久国产精品免费一区二区| 久久亚洲精品人成综合网| 99久久人人爽亚洲精品美女 |