第9章符號表

2021-10-01 08:49:15 字數 2228 閱讀 5593

adt符號表概念:以集合為基礎,並支援member、insert和delete三種運算的抽象資料型別叫做符號表

用固定陣列實現符號表

陣列實現符號表的結構定義如下:

typedef

struct atab *table;

typedef struct atabatab;

雜湊有兩種形式,一種是開雜湊(外部雜湊),它將符號表元素存放在乙個潛無窮的空間裡,能處理任意大小的集合

另一種是閉雜湊(內部雜湊),它使用乙個固定大小的儲存空間,所能處理的集合大小不能超過其儲存空間大小

開雜湊的基本思想是將集合的元素(可能有無窮多個)劃分成有限個類。例如,劃分為0,1,…,b-1這b個類。

用雜湊函式h將集合中的每個元素x對映到0,1,…,b-1之一,h(x)的值就是x所屬的類。

函式h(x)的值稱為元素x的雜湊值。

每乙個類稱為乙個桶,並且稱x屬於桶h(x)。

期望雜湊能均勻,使得當桶陣列的規模與符號表的規模同階時,桶陣列的每乙個桶中大致有常數個元素,從而對符號表的三個基本操作都只需要常數時間。 這裡的問題是如何雜湊即如何構造雜湊(對映)函式去達到設想的期望?

*x)用開雜湊表實現的符號表結構openhashtable定義如下:

typedef

struct open *openhashtable;

typedef

struct openopen;

由此可以看出,開雜湊表是將陣列和表結合在一起的一種資料結構

雜湊需要解決的問題

1、 構造好的雜湊函式

(1)所選函式盡可能簡單,以便提高轉換速度。

(2)所選函式對關鍵字計算出的位址,應在雜湊位址集中大致均勻分布,以減少空間浪費。

2、 制定解決衝突的方案

3、需要對ht[ ]的每乙個桶的狀態加以標記:

state[k]=0表示ht[k]桶存放著元素。

state[k]=1表示ht[k]桶一直是空桶。

state[k]=2表示ht[k]桶現在是空桶但曾經存放過元素

檢測乙個元素x是否在乙個閉雜湊表中,只要順序檢視桶h(x),h1(x),h2(x),…。

在某個桶中找到x,則x在這個閉雜湊表中。

沒有找到x而遇一空桶,是否可以斷定x不在這個閉雜湊表中?

如果在這個閉雜湊表中沒有執行過刪除操作,可以斷定x不在閉雜湊表中。

如果對這個閉雜湊表執行過刪除操作,就無法確定所遇到的空桶在當初存放x時是否曾被占用,因而也就無法確定x是否在閉雜湊表中。

解決這個問題的乙個有效方法是對ht[ ]的每乙個桶的狀態加以標記.

雜湊函式的構造方法

3、平方取中法:取關鍵字平方後的中間幾位作為雜湊位址(若超出範圍時,可再取模)

4、摺疊法:將關鍵字分成幾個部分,再將這幾個部分結合(作某一運算)起來的值作為雜湊位址。——常用於關鍵字的位數較多的情況

5、數值分析法:如果事先知道所有可能的關鍵字的取值時,可通過對這些關鍵字分析,發現其變化規律,構造出相應的函式

處理衝突的方法

1、線性探測法:當由h(k)算出的位置不空時,依次用下面函式以找出乙個新的空位置

hi(k)=(h(k)+di) mod m,其中 i=1,2,…k(k≤m-1)

其中:m為雜湊表長度,di的取值常用如下形式:di=i,即di為增量序列,依次取值 1,2,……,m-1

Linux裝置驅動之第 2 章 核心符號表

2.5.核心符號表 insmod使用公共核心符號表來解析模組中未定義的符號。公共核心符號表包含所有的全域性核心項 函式和變數 的位址,這是實現模組化驅動程式所必需的。當模組被裝入核心後,這個模組匯出的任何符號都會變成核心符號表的一部分。通常情況下,模組只需實現自己的功能,而無需匯出任何符號。但是,如...

邏輯符號表

邏輯符號表 跳轉到 導航,搜尋 在邏輯中,經常使用一組符號來表達邏輯結構。因為邏輯學家非常熟悉這些符號,他們在使用的時候沒有解釋它們。所以,給學邏輯的人的下列 列出了最常用的符號 它們的名字 讀法和有關的數學領域。此外,第三列包含非正式定義,第四列給出簡短的例子。要注意,在一些情況下,不同的符號有相...

數學符號表

符號 名稱定義 舉例讀法 數學領域 等號y xy1 1 2 等於所有領域 不等號x y xy 不等於 所有領域 嚴格不等號 xyx3 4 5 4 小於,大於 序理論 不等號x y x yx 3 4 5 5 5 4 5 5 小於等於,大於等於 序理論 加號 4 6 表示 4 加 6。2 7 9加算術 ...