本發明涉及一種基于圖的前綴可判斷的任意長度電話號碼存儲和查詢方法,本發明來源于在不同類型的電話系統構成的電話網絡中,在各系統間互相撥打電話時,包含電話號碼適配功能、語音服務器查詢功能的語音網關設備,以及包含電話號碼查詢功能、歸屬地查詢功能的電話終端設備。其中涉及使用圖結構存儲和查詢任意長度電話號碼的方法,特別涉及能夠判斷電話號碼前綴的查詢方法。
背景技術:
在一個由多種不同類型的電話系統構成的電話網絡中,需要語音網關進行電話系統間話音業務的轉發。但是,各電話系統的撥號方式往往有所不同。如某些電話交換機系統撥打外線號碼規則為添加前綴89,某些企業內部電話交換機需添加前綴9,某些基于IP電話的語音服務器可任意設置前綴規則或者不添加前綴號碼。這些電話交換機或語音服務器可能會將前綴號碼一并送給語音網關,語音網關需要對這些不同格式、不同前綴、不同規則的電話號碼進行適配,判斷此電話號碼應該轉發給哪個交換機或者語音服務器。某些語音網關系統或者電話終端設備還需要包含查詢電話號碼的歸屬地、聯系人信息的功能。
一般地,系統使用電話號碼表存儲和查詢電話號碼。常用的電話號碼表存儲和查詢方法有兩種:哈希散列法和字典樹法。這兩種方法都是使用特定的數據結構構造電話號碼表,達到電話號碼存儲和查詢的目的。
在小型的語音網關系統或者電話終端設備中,常使用哈希散列表存儲電話號碼。該方法需要將所有已知號碼逐條、完整的存儲。該方法實現簡單,但是需要消耗巨大的存儲空間,因此只適合存儲少量的電話號碼。在大中型語音網關系統中,多使用字典樹存儲電話號碼,這種方法將有公共頭的電話號碼合并存儲在同一結點中,優化了存儲空間。
上述兩種電話號碼存儲和查詢方法,在處理前綴號碼問題時一般有兩個解決方案。第一種方案,將帶有不同前綴和不帶前綴的電話號碼分別當做獨立的電話號碼存儲。例如,分別存儲815002、89815002,無論查詢815002還是89815002,都能匹配到正確的電話號碼。但是,每增加一個新的前綴號碼,電話號碼表就要多消耗一倍的存儲空間,造成了存儲空間的巨大消耗。第二種方案,增加獨立的前綴號碼表,在查詢電話號碼前,先遍歷前綴號碼表,判斷前綴號碼。例如,前綴號碼表中存儲了號碼89,查詢電話號碼前,先查詢前綴號碼表,若待查詢電話號碼以89開頭,則先將89刪除,再使用剩余位數去電話號碼表中查詢。由于需要增加前綴號碼表,因此該方案需要增加額外的存儲空間。由于無論待查詢的電話號碼是否包含前綴號碼,每次查詢電話號碼時都要遍歷前綴號碼表,因此該方法也會增加額外的查詢時間。
以上兩種方法都不能較好的解決查詢電話號碼時,判斷電話號碼前綴的問題。要么大幅增加存儲空間,要么增加查詢步驟,增加查詢時間。
技術實現要素:
鑒于上述現有技術現狀,本專利提供一種基于圖的前綴可判斷的任意長度電話號碼存儲和查詢方法。本方法采用有向圖數據結構,在一張圖中同時存儲電話號碼和前綴號碼,為圖中的結點添加屬性,添加前綴號碼結點指向根結點的路徑,實現在查詢電話號碼的同時判斷前綴號碼的目的。
本專利為實現上述目的,所采取的技術方案是:一種基于圖的前綴可判斷的任意長度電話號碼存儲和查詢方法,利用語音網關或電話終端設備為平臺,實現電話號碼存儲和查詢功能,其特征在于,使用圖結構存儲電話號碼,可查詢任意長度的電話號碼,可判斷電話號碼前綴,步驟如下:
步驟一、存儲電話號碼,規則為:構造一棵字典樹,從根結點開始,依次使用待存儲電話號碼的每一位數字創建子結點,每個子結點的值等于該數字,從根結點至葉子結點的路徑,不包含根結點,表示一個完整的電話號碼,兄弟結點間的值不重復,具有相同前綴的電話號碼擁有共同的父結點,按上述方法為每個不包含前綴的電話號碼創建對應路徑;
步驟二、按步驟一中的方法為所有已知的前綴號碼在同一棵樹中創建路徑,前綴號碼與步驟一中的電話號碼可共同擁有相同的父結點;
步驟三、為每個結點標識結點屬性,結點屬性有以下四種:0x00表示此結點為中間結點,該結點不包含任何附加信息,0x01表示此結點為服務器結點,該結點包含語音服務器信息,0x02表示此結點為聯系人結點,該結點包含此電話號碼所屬聯系人信息,0x04表示此結點為前綴結點,從根結點至此結點的路徑為前綴號碼,一個結點最多可以包含兩個屬性:前綴結點屬性和任意一個其他屬性;
步驟四、為前綴結點添加指向根結點的路徑,將樹升級為有向圖;
步驟五、查詢電話號碼,規則為:從步驟一中描述的根結點開始作為當前結點,依次讀取待查詢電話號碼中的每一位數字,并與當前結點所指向的所有鄰接結點的值進行比較,若相等,則匹配該鄰接結點成功,繼續以該鄰接結點作為當前結點,遍歷電話號碼中的下一位數字,若當前結點所指向的所有鄰接結點中沒有與該數字相等的結點,或已讀完待查詢電話號碼中的所有數字,則結束查詢;
步驟六、遍歷過程中,若當前結點包含服務器結點屬性,則提取此結點存儲的服務器信息,并繼續遍歷,若當前結點包含聯系人結點屬性,則提取此結點存儲的聯系人信息,并結束查詢,若遍歷至前綴結點,則根據該結點的指向返回起始結點繼續遍歷;
步驟七、為了防止死循環的發生,約定一個結點的前綴屬性只能生效一次,第二次遍歷至該結點則忽略其前綴屬性繼續遍歷;
步驟八、結束查詢時,若遍歷過程中成功查詢到服務器信息或聯系人信息,則查詢成功,否則查詢失敗。
本方法特點是:在存儲空間方面,假設前綴號碼的位數為“M”,不包含前綴號碼的電話號碼的位數為“N”。使用哈希散列法存儲不包含前綴號碼的電話號碼消耗的存儲空間最大為N×10N個存儲單元。使用字典樹法存儲不包含前綴號碼的電話號碼消耗的存儲空間最大為(10(N+1)-1)/9個存儲單元。當使用哈希散列法存儲電話號碼表,且使用第一種前綴號碼解決方案時,需要的存儲空間最大為原電話號碼表的M×10M倍。當使用字典樹法存儲電話號碼表,且使用第二種前綴號碼解決方案時,需要的存儲空間最大為在原電話號碼表的基礎上,增加(10(M+1)-1)/9個存儲單元。而本發明相比原電話號碼表,當M≤N時,不增加任何存儲空間;當M>N時,最大僅增加(10(M+1)-10(N+1))/9個存儲單元。因此,本發明相比現有的兩種技術方案,可大幅降低存儲空間消耗。
在查詢時間方面,本發明與第一種方案前綴號碼解決方案耗時相當,本發明在查詢沒有前綴號碼的電話號碼時,不增加額外的查詢時間,但第二種前綴號碼解決方案無論待查詢電話號碼是否包含前綴號碼,都需遍歷前綴號碼表,因此本發明在總體查詢時間上優于第二種前綴號碼解決方案。
綜上所述,在判斷電話號碼前綴時,本方法將前綴號碼與不包含前綴的電話號碼合并存儲在一張圖中,既不大幅增加存儲空間,又無需增加額外的查詢時間。本方法比第一種前綴號碼解決方案大幅減少存儲空間消耗。本方法比第二種前綴號碼解決方案大幅減少存儲空間消耗和總體查詢時間。相比現有技術方案,本方法使用更少的存儲空間和更短的查詢時間,大大提高了電話號碼的存儲和查詢效率,可有效降低存儲和查詢操作的空間復雜度及時間復雜度,極大提升執行效率。因此,本方法是一種整體上優于現有技術方案的方法。
本方法適用于語音網關或電話終端設備的電話號碼存儲和查詢功能。
附圖說明
圖1為本發明的有向圖存儲結構示意圖。
具體實施方式
為了更清楚的理解本發明,結合附圖和實例詳細描述本發明:
某電話網絡由三個電話系統組成。系統一是某型號IP電話系統,區號為“81”,內部包含一個號碼為“5002”的電話(以下簡稱目標電話)。系統二是某型號ATM電話交換機系統,該系統呼叫外線號碼的方法為“89+外線電話號碼”,即系統二呼叫系統一中的目標電話需要撥打的電話號碼為“89815002”,其中“89”是前綴號碼。系統三是某型號模擬電話系統,該系統呼叫外線號碼的方法為直撥外線電話號碼,即系統三呼叫系統一中的目標電話需要撥打的電話號碼為“815002”。三個電話系統呼叫外線號碼時均將該號碼送至語音網關進行轉發。
存儲時,語音網關將電話號碼“815002”及前綴號碼“89”按步驟一至步驟四所述的方法存儲在磁盤中;
步驟一、存儲不包含前綴的電話號碼“815002”;首先構造一棵字典樹。從此字典樹的根結點開始,依次使用“8”、“1”、“5”、“0”、“0”、“2”共6個數字創建6個結點,每個結點的值等于該數字。從根結點開始,后一個結點作為前一個結點的子結點。從根結點到葉子結點“2”的路徑表示完整的電話號碼“815002”。
步驟二、存儲前綴號碼;按步驟一中的方法在上述字典樹中創建路徑“89”。路徑“89”與路徑“815002”擁有相同的父結點“8”。
步驟三、為每個結點標識結點屬性;其中,將結點“1”標識為0x01服務器結點,添加號碼“815002”所屬的語音服務器地址:“IP=192.168.10.121”,將結點“2”標識為0x02聯系人結點,添加號碼“815002”所屬的聯系人姓名:“張三”。將結點“9”標識為0x04前綴結點,將其余結點標識為0x00中間結點。
步驟四、為前綴結點“9”添加指向根結點的路徑,將樹升級為有向圖。
步驟四中描述的有向圖存儲結構如圖1所示。
若系統三呼叫號碼“815002”,則語音網關發起查詢操作,查詢過程為:從“根”結點開始使用第一位號碼“8”與“根”結點指向的鄰接結點“8”比較,相等,匹配成功。繼續使用下一位號碼“1”與結點“8”指向的鄰接結點“9”、“1”分別比較,結果是與結點“1”匹配成功。依此類推,最終號碼“2”與結點“2”匹配成功,結束查詢,得到路徑“815002”。遍歷過程中成功查詢到電話號碼“815002”的語音服務器IP地址“192.168.10.121”和聯系人姓名“張三”。
若系統二呼叫號碼“89815002”,則語音網關發起查詢操作,查詢過程為:從根結點開始使用第一位號碼“8”與根結點指向的鄰接結點“8”比較,相等,匹配成功。繼續使用下一位號碼“9”與結點“8”指向的鄰接結點“9”“1”分別比較,結果是與結點“9”匹配成功。結點“9”的屬性是前綴結點,依據遍歷規則,設置當前結點為“9”指向的鄰接結點——“根”結點,繼續遍歷下一位號碼“8”。依此類推,在遍歷結束時獲得路徑“89815002”,并獲得前綴號碼“89”。遍歷過程中成功查詢到電話號碼“89815002”的語音服務器IP地址 “192.168.10.121”和聯系人姓名“張三”。
若系統二呼叫號碼“89845002”,則語音網關發起查詢操作,查詢過程與上述“89815002”過程類似,區別是遍歷過程中以結點“8”為當前結點時,沒有找到結點“8”指向的值為“4”的鄰接結點,結束查詢,且查詢過程中沒有遍歷到服務器結點和聯系人結點,查詢失敗。
根據上述說明,結合本領域技術可實現本發明的方案。