原创 並查集 和 路徑壓縮

      並查集,在一些有N個元素的集合應用問題中,我們通常是在開始時讓每個元素構成一個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其特點是看似並不複雜,但數據量極大並查集是一種樹型的數據結構,用於處理一些不相交集合的

原创 初遇數論

      這是我寫的第一份博客,以後會堅持寫下去。我是一隻菜鳥,不求能寫出精緻的文章,只是想借助CSDN這個載體把自己學到的知識在這裏記錄一下順便鞏固一下;      這是我暑假留校的第二週,第一週學習的是C語言進階,第二週學習的是數論

原创 常量指針 與 指針常量

      今天偶然想到了一個問題那就是:const* int  p 與  int  const* P 兩者之間有什麼區別? 去網上搜索了一下指針常量 和 常量指針的區別: 指針常量:       指針常量是,首先它是一個常量用指針來修飾

原创 圖論-Dijkstra

      Dijkstra-迪傑斯特拉 算法 算法是處理單源最短路徑問題常用的算法,雖然時間複雜度(n^2)較高(但是可以優化),但是編寫起來方便在處理小數據時還是很方便的.       dijkstra 算法,在使用時需要指定一個起始

原创 堆-二叉堆

      我們這裏說的堆並不是內存中的堆,我們所說的是數據結構-堆,堆 也叫優先隊列是一種特殊的完全二叉樹,看下圖這棵完全二叉樹有什麼特點? 他的每個父節點的值都不小於其子節點的值。這稱爲一個最大堆,最小堆就是父節點的值均不大於字節點的

原创 最小生成樹 - prim 算法

      最小生成樹 :在一個有n 個結點的連通圖G中,G的一個連通子圖中包含原圖中的所有 n 個結點,在使邊的權之和最小的情況下含有使保持圖連通的最少的邊。這個連通子圖就是  G 的一個最小生成樹。       注:最小生成樹不唯一,

原创 拓撲排序

      拓撲排序是將一個有向無環圖G的點進行排序形成一個線性序列,這個線性序列滿足:對於途中任意一對頂點,若邊(u,v) E (G),則再線性序列中 u 一定在v的前面,我們將這樣的線性序列稱爲滿足拓撲次序的序列。  算法很簡單: 1

原创 最小生成樹-kruskal

      kruskal (克魯斯卡爾) 算法與前面的 prim(普里姆)算法都是求最小生成樹的算法,prim 在沒有任何優化的情況下時間複雜度爲O(n^2) kruskal 的時間複雜度與使用的排序算法有關 若用快排(qsort) 時

原创 Floyd 算法----只有5行的算法

      與前面寫的Dijkstra 都是關於最短路徑的算法,但是不同的是Dijkstra算法是計算單源最短路徑的算法,也就是隻能計算出一個點到其他點的最短路徑,Floyd算法是多源最短路徑算法,可以計算出任意兩點的最短路徑。    

原创 關於C 語言的內存分配問題

      我們在做題時開數組經常會出現爆棧問題,那麼這是爲什麼?       讓我們帶着問題先來了解一下C語言的內存分區,C語言內存分爲五個區: 代碼區:顧名思義這裏是用來存儲代碼編譯後的二進制機器碼; 堆區:用於動態內存分配,一般由程

原创 深度優先搜索及奇偶剪枝

    深度優先搜索實現方式有很多種,我學習的是藉助於遞歸來完成的,先講一個簡單的例子:給定一個整數 n,輸出n的全排列; 先用深搜實現一下: #include<stdio.h> int book[100] ,a[100],sum =

原创 搜索二叉樹

      今天學到了搜索二叉樹趕緊來鞏固一下。       簡單介紹一下數據結構中的樹 ,在《離散數學》中樹的定義是:連通無迴路的圖 。       樹(tree)是包含n個結點的有窮集,其中 每個元素稱爲節點,樹中邊的條數 爲 n -

原创 單調隊列

單調隊列是通過維護隊列嚴格單調來解決問題,先看一個問題(北大OJ 2823): 分析一下問題:這是一個滑動窗口問題,題意是(英語菜雞的翻譯): 給你一個大小爲 n (n<=10^6)的數組,有一個大小爲k的滑動窗口從最左邊移動到最右邊

原创 樹的三種遍歷方式

      今天學到了樹的三種遍歷方式:前序遍歷,中序遍歷,後序遍歷,層序遍歷;這裏的 前中後 指的是頭節點在遍歷中的訪問次序。層序遍歷 就是一層一層的打印 即 由上到下 由左到右 打印。 來看一看這四種遍歷方式的代碼:       前序

原创 廣度優先搜索

      廣度優先搜索與前面的深度優先搜索是兩種特別常用圖的搜索算法,廣度優先搜索,是在搜索的把當前能到的點全部用隊列儲存起來,然後在進行隊列中下一個點的搜索,知道把圖搜索完成或達到了某個特定條件再結束。 看一道簡單例題:給定一張地圖,