數據結構與算法

1:實現單鏈表的逆置
html

2: 有個單鏈表,不知道節點N的值,怎樣只遍歷一次就能夠求出中間節點?面試

 解:設立兩個指針,好比*p, *q, p每次移動兩個位置,即 p = p->next->next, q每次移動一個位置,即 q = q->next,當p到達最後一個節點時,q就是中間節點。算法

3:如何找出單鏈表中的倒數第k個元素?數組

  思路:設立兩個指針*p,*q, p一開始指向單鏈表的第k個節點,q一開始指向頭結點,而後p,q同時向後移動,當p移動到尾節點時,q就是咱們須要找的位置。服務器

4:一致性hash算法原理數據結構

4.1:從頭至尾解析Hash表算法spa

5:100億個數據中找出最大的10個?.net

 思路:線程

  一、首先一點,對於海量數據處理,思路基本上是肯定的,必須分塊處理,而後再合併起來。指針

  二、對於每一塊必須找出10個最大的數,由於第一塊中10個最大數中的最小的,可能比第二塊中10最大數中的最大的還要大。

  三、分塊處理,再合併。也就是Google MapReduce 的基本思想。Google有不少的服務器,每一個服務器又有不少的CPU,所以,100億個數分紅100塊,每一個服務器處理一塊,1億個數分紅100塊,每一個CPU處理一塊。而後再從下往上合併。注意:分塊的時候,要保證塊與塊之間獨立,沒有依賴關係,不然不能徹底並行處理,線程之間要互斥。另一點,分塊處理過程當中,不要有反作用,也就是不要修改原數據,不然下次計算結果就不同了。

  四、上面講了,對於海量數據,使用多個服務器,多個CPU能夠並行,顯著提升效率。對於單個服務器,單個CPU有沒有意義呢?

    也有很大的意義。若是不分塊,至關於對100億個數字遍歷,做比較。這中間存在大量的沒有必要的比較。能夠舉個例子說明,全校高一有100個班,我想找出全校前10名的同窗,很傻的辦法就是,把高一100個班的同窗成績都取出來,做比較,這個比較數據量太大了。應該很容易想到,班裏的第11名,不多是全校的前10名。也就是說,不是班裏的前10名,就不多是全校的前10名。所以,只須要把每一個班裏的前10取出來,做比較就好了,這樣比較的數據量就大大地減小了。

5.1 十道海量數據處理面試題與十個方法大總結

6:洗牌算法

7:堆的數據結構 比較適合處理像海量數據中找到前100個這種相似的問題

8:求兩個整數的最大公約數GCM

9:二分查找

10:快速排序

11:冒泡排序

//  冒泡排序  
    public void bubbleSort() {
        for(int out = nElems - 1; out > 1; out--)
            for(int in = 0; in < out; in++ )
                if(array[in] > array[in+1])
                    swap(in, in+1);
    }

12:選擇排序

// 算法思路:在這些數據中從頭開始找最小的一個數,找到了就和第一個相互交換,換過以後,就表明第一個數不須要在排序了,
// 接着從第二個數開始遍歷查找最小的,找到了,就和第二個位置的數交換,就這樣往下循環,就能夠了。
    public void selectSort() {
        int out, in, min;
        
        for(out = 0; out < nElems - 1; out++) {
            min = out;
            for(in = out + 1; in < nElems; in++)
                if(array[in] < array[min])
                    min = in;
            swap(out, min);
        }
    }

13:插入排序

 /* 插入排序:起始條件:有一個無序的數組
          比較一個數以前,先保存在一個臨時值裏面,
          一開始,先將數組的第二個裏面的數保存在一個臨時temp中,而後與數組的第一個值比較大小 a[0]與a[1],若第一個大,則交換值
          下一次循環從數組的第三個值開始比較,由於前面的是有序的了,因此先和第數組的第二個值比較大小,若a[1]>a[2],交換數值,接着和a[0]比較。因此整個插入排序就很清楚了
 */
    public void insertSort() {
        int in, out;
        
        for(out = 1; out < nElems; out++) {
            long temp = array[out];
            in = out;   //in做爲標記最終插入的地方
            while(in > 0 && array[in-1] > temp) {
                array[in] = array[in-1];
                --in;
            }
            array[in] = temp;
        }
        
    }

 14:不用臨時變量交換兩個數的值 

int main(int argc, char *argv[])
{
    int a = 2, b = 6;

    a = a ^ b;
    b = b ^ a;
    a = a ^ b;

    printf("a = %d b = %d/n", a, b);

    return 0;
}

異或運算符^也稱XOR運算符,它的規則是若參加運算的兩個二進位同號,則結果爲0(假);異號爲1(真)。即0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0 

  知足性質:    一、交換律

           二、結合律(即(a^b)^c == a^(b^c))

           三、對於任何數x,都有x^x=0,x^0=x

                       四、自反性 A XOR B XOR B = A xor  0 = A

15:怎麼判斷鏈表有環

相關文章
相關標籤/搜索