青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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 閱讀(541) | 評(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è)人簡歷相一致。 3、表述方式上盡量口語化。 4、要切中要害,不談無關(guān)、無用的內(nèi)容。 5、條理要清晰,層次要分明。6、事先最好以文字的形式寫好背熟。
 
  問題二:“談?wù)勀愕募彝デ闆r”
 
  思路:1、 況對(duì)于了解應(yīng)聘者的性格、觀念、心態(tài)等有一定的作用,這是招聘單位問該問題的主要原因。 2、 簡單地羅列家庭人口。 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、不宜說太長的座右銘。 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)聘者的誠懇、機(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ā)揮我的專長就可以了。”
 
  問題十六:“您在前一家公司的離職原因是什么?”
 
  思路: 1、 最重要的是:應(yīng)聘者要使找招聘單位相信,應(yīng)聘者在過往的單位的“離職原因”在此家招聘單位里不存在。 2、 避免把“離職原因”說得太詳細(xì)、太具體。 3、 不能摻雜主觀的負(fù)面感受,如“太幸苦”、“人際關(guān)系復(fù)雜”、“管理太混亂”、“公司不重視人才”、“公司排斥我們某某的員工”等。 4、 但也不能躲閃、回避,如“想換換環(huán)境”、“個(gè)人原因”等。 5、 不能涉及自己負(fù)面的人格特征,如不誠實(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 閱讀(191) | 評(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 閱讀(1225) | 評(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 閱讀(249) | 評(píng)論 (0)編輯 收藏

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


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

算法的力量
2006年5月

算法是計(jì)算機(jī)科學(xué)領(lǐng)域最重要的基石之一,但卻受到了國內(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ù)庫原理等等在開復(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)為我是靠僥幸才打贏他,不服氣地問我的程序平均每秒能搜索多少步棋,當(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ì)算能力每年都在飛快增長,價(jià)格也在不斷下降可我們不要忘記,需要處理的信息量更是呈指數(shù)級(jí)的增長現(xiàn)在每人每天都會(huì)創(chuàng)造出大量數(shù)據(jù)(照片,視頻,語音,文本等等)日益先進(jìn)的記錄和存儲(chǔ)手段使我們每個(gè)人的信息量都在爆炸式的增長互聯(lián)網(wǎ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)求呢?

最簡單的辦法就是把整個(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è)水庫玩,而一個(gè)水庫有好幾個(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ù)雜的問題分解成若干簡單的小問題,然后再選用合適的算法和數(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)長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è)簡單的并行算法: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)用一同成長

算法并不局限于計(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ī)療方式在國家安全領(lǐng)域,有效的算法可能避免下一個(gè)911的發(fā)生在氣象方面,算法可以更好地預(yù)測(cè)未來天災(zāi)的發(fā)生,以拯救生命

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

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

(1)練內(nèi)功不要只花功夫?qū)W習(xí)各種流行的編程語言和工具,以及某些公司招聘廣告上要求的科目要把數(shù)據(jù)結(jié)構(gòu)算法數(shù)據(jù)庫操作系統(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í)很多中國大學(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í)際工作,比如一些看似簡單的編碼或測(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)是美國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 閱讀(287) | 評(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 閱讀(617) | 評(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)榍罢咝枰_方和求矢量長度,矢量長度相當(dāng)于一次點(diǎn)乘,三個(gè)點(diǎn)乘加一個(gè)開方,顯然不如

               后者一次叉乘加一次矢量長度(注,一次叉乘計(jì)算相當(dāng)于2次點(diǎn)乘,一次矢量長度計(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在三角形的邊上。

          有沒有更簡單的推導(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 閱讀(1657) | 評(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)鍵路徑的長度是:

  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 閱讀(557) | 評(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 閱讀(166) | 評(píng)論 (0)編輯 收藏

http://blog.csdn.net/robinfoxnan/archive/2008/07/25/2712030.aspx
1. 簡單實(shí)現(xià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 閱讀(385) | 評(píng)論 (0)編輯 收藏

僅列出標(biāo)題
共20頁: First 12 13 14 15 16 17 18 19 20 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美91视频| 午夜欧美精品久久久久久久| 亚洲欧洲日本专区| 国内精品久久久久久久影视麻豆 | 欧美一区二区三区精品| 亚洲欧美日韩电影| 欧美在线网址| 久久久午夜视频| 欧美成人视屏| 欧美色另类天堂2015| 国产精品网站在线播放| 国产日本精品| 亚洲人成网站精品片在线观看| 91久久精品日日躁夜夜躁国产| 亚洲精品在线观| 亚洲夜晚福利在线观看| 久久精品亚洲一区二区| 欧美黄色小视频| 亚洲视频网站在线观看| 久久久久国色av免费观看性色| 欧美顶级少妇做爰| 国产精品羞羞答答xxdd| 亚洲国产日韩一区二区| 性色av一区二区三区| 欧美粗暴jizz性欧美20| 亚洲视屏一区| 欧美91福利在线观看| av成人免费在线| 国产欧美大片| 娇妻被交换粗又大又硬视频欧美| 亚洲激情中文1区| 亚洲欧美在线视频观看| 欧美国产精品专区| 午夜精品福利视频| 欧美日韩国产麻豆| 在线观看一区| 久久精品视频99| 一区二区欧美亚洲| 嫩草伊人久久精品少妇av杨幂| 国产日本欧洲亚洲| 亚洲视频日本| 欧美成人精品一区二区| 亚洲欧美一区二区视频| 欧美午夜免费| 日韩视频免费观看高清在线视频| 久久免费视频在线观看| 中文日韩欧美| 欧美日韩一区免费| 亚洲精品在线观看免费| 女女同性女同一区二区三区91| 亚洲欧美成人网| 国产精品免费观看视频| 宅男精品视频| 99国产精品久久久久久久成人热| 美女视频黄a大片欧美| 国产一区二区三区不卡在线观看| 正在播放欧美视频| 91久久中文字幕| 久久久噜噜噜久久人人看| 国产伦理一区| 久久成年人视频| 亚洲欧美视频在线观看视频| 国产精品日韩久久久久| 欧美一区二区精美| 亚洲欧美中文字幕| 国产又爽又黄的激情精品视频| 欧美亚洲免费高清在线观看| 亚洲尤物在线| 国产一区二区三区久久精品| 久久久久9999亚洲精品| 久久精品国产99国产精品澳门| 狠狠干狠狠久久| 美女91精品| 欧美第一黄网免费网站| 99视频日韩| 亚洲天堂成人在线观看| 国产美女精品一区二区三区| 欧美在线黄色| 蜜臀久久99精品久久久久久9| 亚洲经典三级| 中日韩在线视频| 国产亚洲精品久久久| 欧美第一黄网免费网站| 欧美激情在线观看| 午夜精品福利一区二区三区av| 欧美一二三视频| 亚洲国产精品综合| 一区二区国产在线观看| 亚洲最新在线| 亚洲一区综合| 影音先锋成人资源站| 欧美激情精品久久久久久| 欧美理论电影在线播放| 校园激情久久| 美脚丝袜一区二区三区在线观看| av成人免费| 久久岛国电影| 一区二区三区av| 欧美伊人久久| 一本色道久久综合狠狠躁的推荐| 亚洲免费在线| 亚洲乱亚洲高清| 午夜欧美大尺度福利影院在线看 | 欧美专区在线播放| 夜夜嗨av一区二区三区四区| 亚洲一区成人| 亚洲欧洲精品一区二区三区 | 欧美凹凸一区二区三区视频| 欧美日韩一区二区在线观看| 久久免费的精品国产v∧| 欧美日韩精品免费观看| 狼狼综合久久久久综合网| 国产精品看片资源| 欧美激情欧美狂野欧美精品| 国产伦精品一区二区三区| 亚洲激情一区二区三区| 影音先锋日韩资源| 亚洲一区三区在线观看| 亚洲毛片在线观看| 久久色在线播放| 欧美一级网站| 国产精品国产三级国产aⅴ无密码| 欧美成人资源| 在线成人免费观看| 午夜在线精品| 性18欧美另类| 国产欧美日韩在线 | 久久夜色精品| 久久精品亚洲一区二区| 国产精品一区在线播放| 一本色道久久综合亚洲精品婷婷| 亚洲国产精品视频一区| 久久九九热免费视频| 久久精品视频在线观看| 国产欧美一区二区白浆黑人| 亚洲深夜福利视频| 在线一区亚洲| 国产精品久久久久一区二区三区| 日韩一区二区电影网| 一本色道久久88精品综合| 欧美欧美天天天天操| 亚洲三级观看| 亚洲视频在线观看| 国产精品video| 亚洲欧美日本国产有色| 久久福利视频导航| 国产一区二区三区久久精品| 久久久久久亚洲精品不卡4k岛国| 久久久欧美精品sm网站| 国产欧美日韩不卡| 狠狠色狠狠色综合日日五| 午夜精品美女自拍福到在线 | 免费一级欧美在线大片| 欧美激情第4页| 亚洲精品久久久蜜桃| 欧美国产精品中文字幕| 日韩视频二区| 欧美伊人久久久久久午夜久久久久 | 亚洲黄色大片| 亚洲视频播放| 国产色视频一区| 久久夜色精品国产| 亚洲精品日韩久久| 午夜免费在线观看精品视频| 国产一区二区中文| 欧美1区2区视频| 亚洲一区二区在线免费观看| 久久免费视频在线观看| 99re6热在线精品视频播放速度 | 国产精品一区=区| 久久国产精品电影| 亚洲欧洲一区二区在线播放| 亚洲综合精品四区| 精品成人久久| 国产精品成人va在线观看| 久久精品一本| 99视频精品免费观看| 久久免费少妇高潮久久精品99| 亚洲美女毛片| 国产一区二区高清不卡| 欧美国产日韩a欧美在线观看| 亚洲少妇最新在线视频| 欧美激情一区二区三区在线视频观看 | 欧美日韩在线观看一区二区| 欧美一区二区在线播放| 亚洲人久久久| 欧美成人蜜桃| 性做久久久久久| 一区二区免费在线视频| 红桃视频国产精品| 国产精品久久久久久久7电影| 免费成人高清在线视频| 欧美一级专区免费大片| 99re6热只有精品免费观看| 欧美jizz19性欧美| 久久精品人人做人人爽电影蜜月| 亚洲午夜精品一区二区| 亚洲精选一区| 91久久国产综合久久91精品网站| 国内精品美女在线观看|