原创 二叉樹的遍歷(前/中/後/層,遞歸&非遞歸)

二叉樹的創建 二叉樹的其他面試題 1、前序遍歷 遞歸 如果二叉樹爲空,則返回空 依次遍歷根節點,左子樹,右子樹 void PreOrder(PBTNode pRoot) { if (NULL == pRoot)

原创 【Linux學習筆記】特殊權限rws、rwS和rwt、rwT

Linux下的文件,除了rwx這些權限外,還有一些特殊的權限,下面我們就來看看這些特殊權限的作用及爲什麼需要這些權限。 1、s權限(setuid) setuid:該位是讓普通用戶可以以root用戶的角色運行只有root帳號才能運

原创 註釋轉換(C to C++)

在寫代碼之前,我們先來看一個概念,即有限轉狀態機(Finite-state machine, FSM)。 什麼是有限狀態機 有限狀態機是一種數學模型,從字面意思理解,就是有有限個狀態的機器。 我們可以想象一條傳送帶,上邊有指示燈

原创 堆的簡單應用——TopK

1、海量數據top k問題 100億個數中找出最大的前K個數,我們可以遍歷K次找到,但是時間複雜度就很大爲 O(KN);因此,我們可以用堆來實現,只需遍歷一次,思路如下: 如果要找前K個最大的數,我們用小堆,每次用堆頂元素和遍歷

原创 【Linux學習筆記】Linux系統下的幾種文件類型

Linux系統不同於window系統,兩者文件類型也有很大的差異。Linux文件類型和Linux文件的文件名所代表的意義是兩個不同的概念。我們通過一般應用程序而創建的比如file.txt、file.tar.gz ,這些文件雖然要用

原创 哈希之海量數據面試題

哈希切割TopK問題 給一個超過100G大小的log file, log中存着IP地址, 設計算法找到出現次數最多的IP地址? 1) 我們首先想到的是對文件進行切割,把它分成1000等份,每一份差不多100M左右。但是在切

原创 哈希之開散列

HashBucket.c #pragma once #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> //#incl

原创 排序的基本概念(及常見的排序算法)

排序的概念 排序 排序就是將一組雜亂無章的數據按照一定的規律(升序或降序)組織起來。 排序碼 通常數據元素有多個屬性域,其中有一個屬性域可用來區分元素,作爲排序依據,該域即爲排序碼。 按主排序碼進行排序,排序的結果是唯一的。 按

原创 C語言的I/O操作(及簡單的mycpy)

一、I/O的概念 流 就C語言而言,所有的I/O操作就是簡單的從程序移進、移出字節的事情,因此這種字節流被稱爲流。 絕大多數的流都是完全緩衝的。“讀取”和“寫入”都是在一塊被稱爲:緩衝區的內存區被來回複製數據。從內存中來回複製數

原创 用堆封裝優先級隊列

1、優先級隊列 優先隊列是一種數據結構,能夠保證每次出隊的是隊列中優先級最高的元素(可以自己定義比較器),使用堆的堆頂元素維護這個優先級最高的元素,因爲堆具有堆序性,堆頂元素要麼是最小的,要麼是最大的。 2、具體代碼實現 代碼中用

原创 【Linux學習筆記】進程間通信之管道

在瞭解管道之前,我們先來了解下進程之間爲什麼需要通信。 1、進程間通信的目的 數據傳輸: 一個進程需要將它的數據發送給另一個進程 資源共享:多個進程之間共享同樣的資源 通知事件: 一個進程需要向另一個或一組進程發送消息,通知它

原创 哈希之閉散列(線性探測/二次探測)

HashTable.h #include <assert.h> #include <stdio.h> #include <malloc.h> #include "Common.h" //哈希表位置的狀態 typedef enum

原创 堆的基本操作解析

堆排序 用堆封裝優先級隊列 海量數據TopK問題 堆的完整源代碼 什麼是堆 首先,堆是完全二叉樹。 小堆: 任何一個節點的值都小於它的左右孩子的值,位於堆頂節結點的值是最小的,從根結點到每個結點的路徑上數組元素組成的序列是遞增

原创 淺談搜索結構之哈希

哈希之閉散列(線性探測/二次探測) 哈希開散列 什麼是哈希 如果構造一種結構,通過某種函數(hashFunc)使元素的存儲位置與它的關鍵碼之間能夠建立一一映射的關係,那麼查找時通過該函數可以很快找到該元素。 插入元素時:根據待插

原创 二叉搜索樹(遞歸&非遞歸)

完整源代碼在此 1、二叉搜索樹的概念 二叉搜索樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹。 若它的左子樹不爲空,則左子樹上所有節點的值都小於根節點的值 若它的右子樹不爲空,則右子樹上所有的節點的值都大於根節點