百度筆試題練習[1] (08-17)

Date: 2019-08-17

1.  有如圖所示的二叉樹,其先序遍歷的序列爲(      )  ABDGCEHF  【回顧樹的先序遍歷-中序遍歷-後序遍歷】

2.   下列有關串,說法正確的是(      ) A

A 除主串S本身外,S的其他子串稱爲S的真子串      (對比真子集的概念)

B 子串在主串的位置是子串最後一個字符在主串的位置  (應該是子串的第一個位置)

C 空串與空格串相等  (不相等,空格串是有長度的)

D 空格串的串長度爲0

3.  給定文法G[E]:E→E+E|E*E|id(id表示任意小寫字母),下列表達式合法的是  D  (回顧文法)

A  a*(b+c)

B a-(b+c)

C    a-b-c

Da+b*c

4.  設一個棧的輸入序列爲1,2,3,4,5, 6,則藉助一個棧所得到的輸出序列不可能是(      )  棧:先進後出[C]

A  1,2,3,4,5,6

B  2,4,3,1,6,5

C 3,1,5,4,2,6

2,3,1,5,6,4

5.  信息檢索系統的評價指標有哪些() ABCD

A 響應時間

B 空間耗費

C 精確度

D召回率

補充: 信息檢索的目的是:較少消耗情況下儘快盡全面地返回正確的結果(包含了以上四個選項)

信息檢索系統常用的評價指標(準確率,召回率,F1,MAP(mean average precision),NDCG(normalized discounted cumulative gain))

信息檢索評價指標介紹

6.  下列關於語言模型的說法錯誤的是()  B

A 基於知識的語言模型通過非歧義的規則解釋歧義過程

B 基於知識的語言模型是經驗主義方法  (錯誤,是非經驗主義的方法)

C 基於語料庫的統計分析模型需要從大規模的真實文本中發現知識

D 基於語料庫的統計模型更加註重用數學的方法

7.  下列關於現有的分詞算法說法錯誤的是() A

A基於統計的分詞方法是總控部分的協調下,分詞子系統獲得有關詞、句子等的句法和語義信息來對分詞歧義進行判斷

B由於在上下文中,相鄰的字同時出現的次數越多,就越有可能構成一個詞,統計語料中的頻度可以判斷是否構成一個詞

C統計分詞系統將串頻統計和串匹配結合起來,既發揮匹配分詞切分速度快、效率高的特點,又利用了無詞典分詞結合上下文識別生詞、自動消除歧義的優點

D中文分詞的準確度,對搜索引擎結果相關性和準確性有相當大的關係

8. 

有一家醫院爲了研究癌症的診斷,對一大批人作了一次普查,給每人打了試驗針,然後進行統計,得到如下統計數字:

    ①這批人中,每1000人有5個癌症病人;

    ②這批人中,每100個正常人有1人對試驗的反應爲陽性,

    ③這批人中,每100個癌症病人有95人對試驗的反應爲陽性。

   通過普查統計,該醫院可開展癌症診斷。

   現在某人試驗結果爲陽性,根據最小風險貝葉斯決策理論,將此患者預測爲患癌症的風險概率爲( )。

假設將正常人預測爲正常人和將癌症患者預測爲癌症患者的損失函數均爲0,將癌症患者預測爲正常人的損失函數爲3,將正常人預測爲癌症患者的損失函數爲1.

&&&& 直接根據貝葉斯定理進行計算:67.7%

9.  假設測試樣本x,若最近鄰樣本爲s,y是類別集合,則KNN分類出錯的概率爲()  1-∑_(b∈y){P(b|x){P(b|s))

10.  【沒懂】如當前樣本集合D中第K類樣本所佔的比列爲P(k)(k= 1,2,3,…,y),則樣本的信息熵最大值爲( )C

C Log2(y)

D log2(P(y)) 但個人覺得是概率,應該選D

11.  下列說法錯誤的是() ACD

A 在聚類分析當中,簇內的相似性越大,簇間的差別越大,聚類的效果就越差

B  聚類分析可以看作是一種非監督的分類

C K均值是一種產生劃分聚類的基於密度的聚類算法,簇的個數由算法自動地確定。

給定由兩次運行K均值產生的兩個不同的簇集,誤差的平方和最大的那個應該被視爲較優。

12.  下列關於數據降維方法說法正確的是(      )ABCD

A  MDS要求原始空間樣本之間的距離在降維後的低維空間中得以保持

B  PCA採用一組新的基來表示樣本點,每個基向量都是原來基向量的線性組合,通過使用儘可能少的新基向量來表出樣本,從而實現降維

C  核化主成分分析爲先將樣本映射到高維空間,再在高維空間中使用線性降維

流形學習是一種藉助拓撲流形概念的降維方法,採用的思想是"鄰域保持"

解釋:

機器學習領域中所謂的降維就是指採用某種映射方法,將原高維空間中的數據點映射到低維度的空間中。降維的本質是學習一個映射函數 f : x->y,其中x是原始數據點的表達,目前最多使用向量表達形式。 y是數據點映射後的低維向量表達,通常y的維度小於x的維度(當然提高維度也是可以的)。f可能是顯式的隱式的線性的非線性的

  目前大部分降維算法處理向量表達的數據,也有一些降維算法處理高階張量表達的數據。之所以使用降維後的數據表示是因爲:①在原始的高維空間中,包含有冗餘信息以及噪音信息,在實際應用例如圖像識別中造成了誤差,降低了準確率;而通過降維,我們希望減少冗餘信息所造成的誤差,提高識別(或其他應用)的精度。 ②又或者希望通過降維算法來尋找數據內部的本質結構特徵。

  在很多算法中,降維算法成爲了數據預處理的一部分,如PCA。事實上,有一些算法如果沒有降維預處理,其實是很難得到很好的效果的。

  • 數據降維的目的

  數據降維,直觀地好處是維度降低了,便於計算和可視化,其更深層次的意義在於有效信息的提取綜合及無用信息的擯棄

  • 數據降維的方法

  主要的方法是線性映射非線性映射方法兩大類。

 降維方法 __ 屬性選擇:過濾法、包裝法、嵌入法; 
       |_ 映射方法  __線性映射方法:PCA、LDA等  
            |__非線性映射方法: 
                      |__核方法:KPCA、KFDA等 
                      |__二維化: 
                      |__流形學習:ISOMap、LLE、LPP等。 
            |__其他方法:神經網絡和聚類 

PCA和LDA區別: PCA是最常用的線性降維方法,它的目標是通過某種線性投影,將高維的數據映射到低維的空間中表示,並期望在所投影的維度上數據的方差最大,以此使用較少的數據維度,同時保留住較多的原數據點的特性。【儘量保持原數據的信息,但是不容易進行不同類別的數據的區分】

LDA:核心思想:往線性判別超平面的法向量上投影,是的區分度最大(高內聚,低耦合)。LDA是爲了使得降維後的數據點儘可能地容易被區分!【不管原始數據的信息,儘量的將數據進行區分】

數據降維小結

關於MDS(多維縮放):保證所有數據點對在低維空間中的距離等於在高維空間中的距離。 MDS

13.  下列屬於常用的分箱方法的是()ABC

A 統一權重法

B 統一區間法

C 自定義區間法

D 平均值法

分箱方法:  數據分箱 特徵分箱

假設要將某個自變量的觀測值分爲k個分箱,一些常用的分箱方法有:1.無監督分箱(1)等寬分箱:將變量的取值範圍分爲k個等寬的區間,每個區間當作一個分箱。

(2)等頻分箱:把觀測值按照從小到大的順序排列,根據觀測的個數等分爲k部分,每部分當作一個分箱,例如,數值最小的1/k比例的觀測形成第一個分箱,等等。

(3)基於k均值聚類的分箱:使用第五章將介紹的k均值聚類法將觀測值聚爲k類,但在聚類過程中需要保證分箱的有序性:第一個分箱中所有觀測值都要小於第二個分箱中的觀測值,第二個分箱中所有觀測值都要小於第三個分箱中的觀測值,等等。

2.有監督分箱

在分箱時考慮因變量的取值,使得分箱後達到最小熵(minimumentropy)或最小描述長度(minimumdescriptionlength)。這裏僅介紹最小熵。

(1)假設因變量爲分類變量,可取值1,…,J。令pl(j)表示第l個分箱內因變量取值爲j的觀測的比例,l=1,…,k,j=1,…,J;那麼第l個分箱的熵值爲Jj=1[-pl(j)×log(pl(j))]。如果第l個分箱內因變量各類別的比例相等,即pl(1)=…=pl(J)=1/J,那麼第l個分箱的熵值達到最大值;如果第l個分箱內因變量只有一種取值,即某個pl(j)等於1而其他類別的比例等於0,那麼第l個分箱的熵值達到最小值。

(2)令rl表示第l個分箱的觀測數佔所有觀測數的比例;那麼總熵值爲kl= 1rl×Jj=1[-pl(j)×log(pl(j ))]。需要使總熵值達到最小,也就是使分箱能夠最大限度地區分因變量的各類別。

14.  在linux系統中查看正在通過ssh登錄的用戶與終端(      )  who | awk '{print $1,$3}'

15.  【沒懂】某數據存放在DS=2000H和DI=1234H的數據段的存儲單元中,則該存儲單元的物理地址爲(      ) 21234H

16.  在分時系統中,時間片設置Q=3,以下關於響應時間的分析,正確的是(     )AD

用戶數量越多響應時間越長

B 內存空間越大響應時間越長

時間片越小響應時間越長

D 進程數量越多響應時間越長

分時系統百科

17. 

Bool bcreateOK=::CreateProcess  

(szFilename,                           

 szCmdLine,                                            

 ① null, 

 ② null,                                                            

    false,                    

 create_new_console,                                        

 ③ null, 

 ④ null,                                                 

 &si,&pi) ;

以上創建進程的代碼中四次出現“null”,作用分析正確的是(     )

①缺省的進程安全性                 

②缺省的線程安全性                  

③新的環境                                  

④當前目錄   

18.  TCP協議規定DNS進程的( )端口號是53    ;服務器的端口是53

19.  關於數組,以下說法正確的是(      )A

A 數組也是一種線性表

B 只有一維數組是線性表

數組不是線性表

D 部分數組是線性表

20.  序列[9,14,11,16,21,15,20,31]爲小頂堆,在刪除堆頂元素9之後,調整後的結果是(      )[11,14,15,16,21,31,20]

直接建立初始最大堆,然後交換堆頂和最後節點的值,然後進行堆的調整!

21.  對任意數列進行排序時,平均排序時間最短的排序算法爲(      ) 歸併排序【除基本有序,快速排序是被公認的最快的排序算法】

22. 利用折半查找算法要在有序表(17,21,34,38,47,54,70)查找元素34需經過(      )次比較  3次比較

解釋:38 —— 34 ——21 注意: 加1  減1 的操作

 

數據挖掘試題:

1. 設A[n][n]爲一個對稱矩陣,數組下標從[0][0]開始。爲了節省存儲,將其上三角部分按行存放在一維數組B[0…m-1],m=n(n+1)/2,對上三角部分中任一元素Aij(i=<j),它在一維數組B的下標k值是(      )(2n-i+1)i/2+(j-i)

解釋:  先求出前i-1行的元素個數,(首項+末項)&times;項數&divide;2=(n+n-i+1)&times;i&divide;2=(2n-i+1)i/2;
再求第i行的元素個數,上三角(j-i+1)
所以下標k值是(2n-i+1)i/2+j-i

2.  若用一個大小爲7的數組來實現循環隊列,且當前front和rear的值分別爲3和0,當從隊列中刪除一個元素,再加入兩個元素後,front和rear的值分別是(      )  4 和2  【記住:隊列是先進先出的數據結構】

3.  如果W是由有序樹V轉換的二叉樹,則V中的結點的後序遍歷順序是W結點的(      )  中序遍歷

4.  判定一個有向圖上是否存在迴路除了可以利用拓撲排序方法外,還可以用: 深度優先遍歷(DFS)【深度優先遍歷是先在一條路徑走到葉節點後回溯,然後繼續遍歷】

5.   設某數據結構的二元組形式表示爲A=(D,R),D={1,2,3,4,5,6,7),R={r},r={<1,2>,<1,3>,<1,4>,<2,5>,<2,6>,<3,7>,<5,6>}D

A 線性結構 (一對一爲線性結構,一對多爲非線性結構)

B 樹型結構 (不存在環路,這裏存在環路)

C 物理結構

D 圖型結構 (允許存在環路)

6.  假設磁頭當前位於第105道,正在向磁道序號增加的方向移動。現有一個磁道訪問請求序列爲35,45,12,68,110,180,170,195,採用SCAN調度算法得到的磁盤訪問序列是(  )  110,170,180,195,68,45,35,12 

7.  

假如我們有如下的mail配置文件:

文件名:/etc/mail/access

test1.com REJECT

test2.com RELAY

test3.com DISCARD

test4.com 501 send message example

對於如上的規則,郵件服務器可以轉或發信的客戶允許來自於(      ) B,允許delay,不允許拒絕、放棄、請求錯誤

A  test1.com 

B  test2.com 

test3.com

test4.com 

8.  

下面四個關係表達式是等價的,試判別它們的執行效率(      )

E1 =πA (σ B=C ∧ D=E′ (R×S) ) 

E2 =πA (σ B=C (R× σD=E′ (S) ) 

E3 =πA (R∞B=CσD=E′(S) )   (執行效率最快)

E4 =πA (σD=E′ (R∞B=C S) ) 

9.  假設設計數據庫性能用“開銷”,即時間,空間及可能的費用來衡量,則在數據庫應用系統生存期中存在很多開銷.其中,對物理設計者來說,主要考慮的是(      )操作開銷

因爲物理設計階段主要負責:存儲結構+存取方法+存取路徑

10.  用parzen窗法估計類概率密度函數時,窗寬過窄導致波動過大的原因是(      )  

窗函數幅度過大

窗口中落入的樣本數過少

11. 下面關於決策規則思想方法說法錯誤的是(      ) D

A   基於最小錯誤率的貝葉斯決策是利用概率論中的貝葉斯公式,得出使得錯誤率最小的分類規則

B   基於最小風險的貝葉斯決策是引入了損失函數,得出使決策風險最小的分類

最大最小決策是在類先驗概率未知的情況下,考察先驗概率變化對錯誤率的影響,找出使最小貝葉斯奉獻最大的先驗概率,以這種最壞情況設計分類器

D   序貫分類方法只考慮分類造成的損失,先用一部分特徵分類,然後逐步加入性特徵以減少分類損失,同時平衡總的損失,以求得最優效益【實際:序貫分類又稱序次分類。採用樹形分類器,由粗到細。樹形分類器則採用序次分類的辦法,每次選擇不同的特徵和不同的決策規則劃分出不同的類別,直至識別出所有的類別。】

12.  

1) 給定n個數據點,一半用於訓練,另一半用於測試,則訓練誤差和測試誤差之間的差別隨着n的增加而增加

2) AdaBoost迭代的訓練分類器,每次更新時,增加之前分錯樣本的權重,減弱分類正確樣本的權重!

3) GBDT是一階taylor展式,而XGBoost是二階泰勒展式  【Bagging是高方差,Boosting是高偏差 】

13.  考慮兩個分類器:1)核函數取二次多項式的SVM分類器 和 2)沒有約束的高斯混合模型(每個類別爲一個高斯模型)。對R2空間上的點進行兩類分類。假設數據完全可分,SVM分類器中不加鬆弛懲罰項,並且假設有足夠多的訓練數據來訓練高斯模型的協方差。下面說法正確的是:這兩個分類器的VC維相同。

注意:在一般的r維空間中,線性決策面的VC維=r+1,  所以所以VC維與所用的分類器或者方法沒有關係??

14.  針對機器學習算法,下面說法錯誤的是: D

A  Apriori算法分爲兩個階段:尋找頻繁項集和由頻繁項集找關聯規則。

B  SVM是基於分類邊界的分類算法,主要是通過訓練,找到這些分類之間的邊界。

C  Adaboost是一種迭代算法,核心思想是針對同一個訓練集訓練不同的分類器,然後將這些分類器集合起來,構成一個更強的最終分類器。 【是在同一訓練集上,而Bagging是有放回的抽樣,是在不同的訓練集上!!!但總體一樣】

D   EM算法是在概率模型中尋找參數最小似然估計的算法,其中概率模型依賴於無法觀測的隱藏變量。【最大似然估計!!】

15.  以下描述正確的是(      )D

A MapReduce 只支持 Java 語言編寫

B如果 NameNode 意外終止,SecondaryNameNode 會接替它使集羣繼續工作。

CBlock Size 是不可以修改的。

DTaskTracker是運行在多個節點上的slaver服務。

16.  DNS服務器配置主要區域的參數有(       ) ABC

Amaster

Btype

Cfile

17.  下面程序的輸出結果爲: 8,1

int change(int m,int n); 
main () 
{ int aa=40,ab=24,ac,ad; 
  ac=change(aa,ab);
  ad=change(aa-1,ab-2);
  printf("%d,  %d\n",ac,ad); 
}
int change(int u,int v)
{ static int w; 
   u=u/(w+1);
   v=v/(w+1);
   while(v) 
   { w=u%v; u=v; v=w; } 
   return u; 
}

18. 某時刻進程的資源使用情況如下表所示,此時的安全序列是(      ) D

A  P1,P2,P3,P4 

B  P1,P3,P2,P4

C  P1,P4,P3,P2 

不存在

19.。 輸出結果爲 10,14 (個人認爲答案是:10,13)


# include <stdio.h>
int f(int x){ 
   static y=2;
   ++y;
   x+=y;
   return x;
}
int main(){
 int k;
 k=f(7);
 printf("%d %d\n", k, f(k));
}

編程題一:excel中cell的記號的轉換:

從R22C54到BB22的相互轉換!

# excel編號轉換
import sys
import heapq
if __name__ == "__main__":
    n = int(sys.stdin.readline())
    for i in range(n):
        line = sys.stdin.readline().strip()
        if "R" == line[0] and line[1].isdigit() and "C" in line:
            x, y = line.replace("R", "").replace("C", " ").split()
            y = int(y)

            prefix = ""
            while y > 0:
                if y % 26:
                    prefix += chr(ord('A') + y % 26 - 1)
                    y /= 26
                else:
                    prefix += "Z"
                    y = y / 26 - 1

            print("".join(list(reversed(prefix))) + x)

        else:
            prefix = ""
            for i, c in enumerate(line):
                if c.isdigit():
                    prefix = line[:i]
                    break

            num = 0

            for j, c in enumerate(prefix):
                num += (ord(c) - ord('A') + 1) * 26 ** (len(prefix) - 1 - j)

            print("R" + line[i:] + "C" + str(num))

編程題二: 正則表達式中()的處理:【沒通過,來自網絡】

#  正則表達式匹配
# -*-coding:utf-8 -*-
import numpy as np
import re
def cost_min_sequence():  # 找到代價最小的括號序列
    result_list = []  # 記錄每次輸入對應的輸出
    # 定義轉換規則
    rule = {'0': '(', '1': ')'}
    while True:
        sequence = raw_input()
        if sequence is '':
            break
        else:
            sequence_flag = True  # 記錄輸入的(??)是否合法
            # 判斷長度
            if len(sequence) > 50000:
                result_list.append(-1)
                sequence_flag = False
            # 判斷格式是否爲(???)
            pattern = '^\(.*?\)$'
            match_result = re.compile(pattern).findall(sequence)
            if len(match_result) == 0:
                sequence_flag = False
                result_list.append(-1)
            # 計算問號的個數
            n = 0
            for i in range(len(sequence)):
                if sequence[i] == '?':
                    n += 1
            if n >= 1:
                costs_list = []
                # 輸入每個問號的代價
                for i in range(n):
                    cost = raw_input()
                    # print cost
                    cost_list = cost.strip().split()
                    # print 'cost_list: \n', cost_list
                    str = ''.join(cost_list)
                    # print 'str: \n', str
                    # print len(str)
                    if str.isalpha() and str.isalnum():  # 檢查輸入的代價是否含有字母
                        return False
                    elif len(str) != 2:
                        return False
                    else:
                        cost_list = [int(i) for i in cost_list]  # 變爲int型
                        costs_list.append(cost_list)

                if not sequence_flag:  # 輸入不合法不用計算
                    continue
                else:
                    if n == 1:  # 如果只有一個問號就不需要計算了
                        result_list.append(-1)
                        continue
                    # 計算每種組合及其代價
                    all_sequence = []  # 保存所有組合
                    all_cost = []  # 保存所有組合的代價
                    for i in range(2**n):  # 如果n=3則有8種組合,第一種000,第二種001,以此類推
                        # 將i用二進制表示出來,並且過濾掉0b
                        bin_i = bin(i)
                        bin_i = bin_i[2:]
                        # 如果bin_i的長度不等於n則用0補齊
                        while len(bin_i) != n:
                            bin_i = '0'+bin_i
                        # 第i種括號組合
                        kh_sequence = '('
                        for j in bin_i:
                            kh_sequence += rule[j]
                        kh_sequence += ')'
                        # 判斷該組合是否滿足正則序列(使用棧)
                        flag = False  # 標識該組合是否是正則序列
                        dict = {'(': ')'}
                        left_list = []
                        for i in kh_sequence:
                            if i in dict.keys():  # 如果是左括號
                                left_list.append(i)
                            else:
                                if len(left_list) == 0:
                                    break
                                else:
                                    if dict[left_list[-1]] != i:
                                        break
                                    else:
                                        left_list.pop()
                        if len(left_list) == 0:
                            flag = True
                        # 如果滿足正則序列計算其代價
                        if flag:  # 比如bin_i = 010,代表有3個問號,第1個和第3個問號取'(',第2個問號取')'
                            all_sequence.append(kh_sequence)
                            cost_sum = 0  # 保存該組合的代價
                            m = 0  # 表示第幾個問號
                            for i in bin_i:
                                cost_sum += costs_list[m][int(i)]
                                m += 1
                            all_cost.append(cost_sum)
                        else:
                            continue  # 該組合不滿足正則序列,計算下一個序列組合

                # 選擇最低的代價
                temp_cost_arr = np.array(all_cost)
                index = np.argsort(temp_cost_arr)  # 返回排序後的索引數組
                min_cost = all_cost[index[0]]
                min_cost_sequence = all_sequence[index[0]]
                # 保存將代價最低的正則序列及其最低代價
                result_list.append(min_cost)
                result_list.append(min_cost_sequence)
            else:  # n<1則退出,比如‘()’
                result_list.append(-1)
                break
    # 打印結果
    if len(result_list) != 0:
        for result in result_list:
            print(result)
if __name__ == '__main__':
    cost_min_sequence()

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章