原创 棧、隊列和鏈表

棧 棧是一種後進先出的策略,其操作包括入棧,出棧,獲取棧頂元素值等。 我們這裏用python列表簡單的模擬棧,考慮上下溢出的情況,其代碼實現如下: class Stack: def __init__(self,sz=65

原创 網絡編程基礎(3)-協議概要-TCP的連接管理

連接的建立與斷開 TCP是一個面向連接的協議。無論哪一方發送數據之前,都必須先在雙方之間建立一條連接。 三次握手建立連接 第一次握手:客戶端向服務端發起連接請求包(稱爲SYN包),設置SYN標誌位爲1,設置序列號seq爲X。 第二次握

原创 查找(3) 跳躍表

原理概述 跳躍表(skip list)是一個有序元素序列快速搜索的數據結構,它的效率和紅黑樹及AVL樹等不相上下,其查找、插入、刪除的期望時間複雜度都是O(lgn),空間複雜度O(n),但是理解和實現起來很容易。 跳躍表是一個基於概率的

原创 網絡編程基礎(4)-協議概要-TCP的流量控制

序列號和確認應答 這裏,我們先回頭來看看在TCP首部中簡要介紹過的序列號和確認應答號。 序列號是按順序給發送數據的每一個字節都標上號碼的編號。序列號用來解決網絡包亂序的問題。 確認應答號是接收端查詢接收數據TCP首部中的序列號和數據長

原创 轉載-一個TCP的全景總結和學習TCP/IP的一個小視頻

地址分別爲: TCP協議疑難雜症全景解析 http://blog.csdn.net/dog250/article/details/6612496 How to TCP/IP works http://v.youku.com/v_sho

原创 網絡編程基礎(6)-協議概要-TCP的擁塞控制

擁塞 當數據從一個大的管道(如一個快速局域網)向一個較小的管道(如一個慢速廣域網)發送時便會發生擁塞。當多個輸入流到達一個路由器,而路由器的輸出流小於這些輸入流的總和時也會發生擁塞。如下圖示例: 上圖展示了一個典型的從大管道向小管道

原创 網絡編程基礎(5)-協議概要-TCP的超時重傳

在兩端通信過程中,發送的數據和確認應答都存在丟失的可能。如下圖: 對此,TCP規定發送數據時設置一個重傳定時器,如果在定時器溢出的時候還沒有收到該數據的確認,那麼重傳該數據。 一方面TCP確實需要重傳丟失的數據以保證傳輸的可靠性,另

原创 網絡編程基礎(1)-協議概要-IP、ICMP、UDP

TCP/IP通信模型 TCP/IP協議分層 TCP/IP通常被認爲是一個多層次的協議系統,每一層分別負責不同的通信功能。下圖是OSI與TCP/IP協議分層模型。 數據鏈路層:或者稱爲網絡接口層,通常包括操作系統中設備驅動程序和網絡接口

原创 查找(2) 紅黑樹

之前講的二叉搜索樹基本集合操作有不錯的平均性能。然而當樹的高度較高時,這些集合操作可能並不比在鏈表執行得快。紅黑樹可以保證在最壞情況下的基本集合操作的時間複雜度爲O(lgn),紅黑樹是平衡搜索樹中的一種。對於平衡樹就講三個比較有代表性的:

原创 排序(1) 初級排序

插入排序之直接插入排序 基本思想:每步將一個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的文件中的適當位置上,使得插入後依然有序,直到全部插入完爲止。 直接插入排序的Python實現如下: def InsertionSort(A,fi

原创 網絡編程基礎(2)-協議概要-TCP首部

TCP的特點 爲了通過IP數據報實現可靠性傳輸,需要考慮很多事情,如數據的破壞、丟包、重複以及分片順序混亂等。TCP通過檢驗和、序列號、確認應答、重發控制、連接管理及窗口控制等實現了面向連接的、可靠的字節流傳輸服務。有了這麼多的措施,所以

原创 排序(5) 線性時間排序

前面所說過的直接插入排序、簡單選擇排序、冒泡排序、希爾排序、歸併排序、堆排序、快速排序都是通過比較關鍵字大小來確定最終序列的,稱之爲基於比較的排序。任何基於比較的排序在最壞情況下運行時間都至少是O(nlgn)級的。本節介紹幾個基於計算而非

原创 排序(3) 堆與堆排序

堆的定義和表示 說到堆排序,得先說說堆這種數據結構。(二叉)堆是一個數組,可以近似的看做一個完全二叉樹。 上圖是堆的兩種表現形式,給定一個下標i,我們可以很容易計算其父節點、左孩子、右孩子的下標: #在二叉堆中計算節點i的父節點、左

原创 查找(1) 二叉搜索樹

定義和表示 搜索樹支持許多動態集合操作,search\minimum\maximum\predecessor(前驅)\successor(後繼)\insert\delete等,所以可以把搜索樹作爲字典或優先隊列。 二叉搜索樹以一棵二叉樹

原创 排序(2) 分治與歸併排序

分治法主要思想 基本思想:歸併排序用了分治的思想。所謂分治法,顧名思義分而治之。將原問題分解爲幾個規模較小的但類似原問題的子問題,然後算法多次遞歸的調用自身以解決這些緊密相關的若干子問題,然後再合併這些子問題的解來建立原問題的解。 分治法