SAS中的哈希表_第1頁
SAS中的哈希表_第2頁
SAS中的哈希表_第3頁
SAS中的哈希表_第4頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、SAS 中的哈希表散列表(Hashtable,也叫哈希表),是根據關鍵碼值(Keyvalue)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。在 SAS 中使用哈希表十分簡單,并不需要知道 SAS 內部是怎么實現的,但要需要知道哈希表是存儲在內存中的,因而容量有一定的限制;在哈希表中查找”并不是真的查找,而是根據 key 值直接獲得存儲的地址。SAS 提供了兩個類來處理哈希表,用于存儲數據的 Hash 和用于遍歷的 Hiter。Hash 類提供了查找、添加、修改、刪除等方法,Hiter 提供

2、了用于定位和遍歷的 firstnext 等方法。使用 Hash 表有以下的一些優點:*鍵值的查找是在內存中進行的,有利于提高性能。* Hash 表可以在數據步運行時動態地添加更新或刪除記錄。也就是說,Hash 表可以對數據進行一些微觀的操作。* 在 Hash 表中可以很快地定位數據,由鍵值直接得到存儲的地址,減少了查找次數。* 使用 Hash 可以做一些 merge 和 sql 難以實現的數據集合并, 在細節上可以有更多的控制。 定義 Hash類需要有下面三個步驟:1 .定義一個對象。2 .實例化該對象。3 .初始化該并對屬性賦值。之后就可以調用 Hash 類的函數實現需要的功能:包括添加、查

3、找、替換、刪除等等。* 定義對象declarehashmyhash;myhash=_new_hash();或者declarehashmyhash();* 初始化對象declarehashvariable_name(argument_tag-1:value-1* ,argument_tag-n:value-n);或者variable_name=_new_hash(argument_tag-1:value-1);初始化時的參數:hashexp:hash 表的框數。在查找數據時,SAS 首先用 hashfunction 得到數據所在的框“,然后再框內查找 key 對應的記錄??騼鹊挠涗浭怯脴湫谓Y構組

4、織的。因而數據查找的時間復雜度為 O(log(N/HSIZE),N 為記錄的條數,Hsize 為框數;因此盡量用最多的框。dataset:定義從哪個數據集中導入數據到哈希表里ordered:定義使用 hiter 變量 hash 表及輸出 hash 表到數據集時的順序。ascending|a:根據 key 值升序。descending|d:根據 key 值降序。YES|Y:升序。NO|N:不排序。例子:dataparticipants;inputname$gender:$1.treatment$;datalines;JohnMPlaceboRonaldMDrug-ABarbaraFDrug-BA

5、liceFDrug-A;dataweight(drop=i);inputdate:DATE9.;doi=1to4;inputname$weight;output;end;/*Forbrevity,onlytwodatesarelistedbelow*/datalines;05May2006Barbara125Alice130Ronald170John16004Jun2006Barbara122Alice133Ronald168John155;dataresults;lengthnametreatment$8gender$1;if_N_=1thendo;declarehashh(dataset:

6、?participants?);h.defineKey(?name?);h.defineData(?gender?,treatment?);h.defineDone();end;setweight;ifh.find()=0thenoutput;run;procprintdata=results;formatdateDATE9.;vardatenamegenderweighttreatment;run;Output:105MAY2006 BarbaraF125Drug-B205MAY2006 AliceF130Drug-A305MAY2006 RonaldM170Drug-A405MAY2006

7、 JohnM160Placebo504JUN2006 BarbaraF122Drug-B604JUN2006 AliceF133Drug-A704JUN2006 RonaldM168Drug-A804JUN2006 JohnM155Placebo說明Hash 是一個類,使用前需要首先進行實例化和初始化,然后定義常用的屬性,在定義完成后才能調用對象的一些方法。本例中 declarehashh(dataset:?participants?);將數據集 participants 實例化成了一個 hash 對象 h,接下來使用 defineKey 和 defineData 定義 hash 表的鍵和值。

8、 接著使用 defineDone 來說明 hash 表的定義已經完成。本例使用了 hash 表的 find 方法,在讀入一條觀測后,使用 find 方法將得到與當前觀測 Key值相等的記錄,如果找到匹配的記錄(find 返回的值為 0)則輸出 Hash 表和主表中的所有變量當前的值。*Exampletwo:Add/Replace/Outputdatagoals;inputplayer$when&$9.;datalines;Hill1st01:24Jones1st09:43Santos1st12:45Santos2nd00:42Santos2nd03:46Jones2nd11:15;da

9、ta_null_;lengthgoals_list$64;if_N_=1thendo;declarehashh();h.defineKey(?player?);h.defineData(?player?,goals_list?);h.defineDone();end;setgoalsend=done;ifh.find()A=0thendo;goals_list=when;h.add();end;elsedo;goals_list=trim(goals_list)|,|when;h.replace();end;ifdonethenh.output(dataset:?goal_summary?);

10、run;procprintdata=goal_summary;run;OutputObsplayergoals_list1Hill1st01:242Santos1st12:45,2nd00:42,2nd03:463Jones1st09:43,2nd11:15說明這個例子使用了 find/add/replace/output 這四個函數,與上個例子不同,本例沒有通過數據集來構建一個 Hash 對象,剛開始時 Hash 表中并沒有記錄。首先通過 find 查看 Hash 表中有無 player 值匹配的記錄,如果沒有就使用 add 方法將當前觀測的鍵和值插入到 Hash 表中。如果 Hash 表中

11、已經有和當前觀測 player 值相等的記錄,則使用 replace 方法更新 Hash表中該記錄的值。在處理完 goals 中的所有觀測后,使用 output 方法將 Hash 表中的記錄輸出到數據集中。在使用 add 時,如果 hash 表中已經存在相應的 Key,當前的觀測會被忽略。需要注意 replace 和 add 的不同,由于在 Hash 表中相同的 key 值只能對于的到一條記錄,當 hash 表中已存在與當期處理的觀測 Key 值相同的記錄時;使用 replace,該 Key 對應的值將被替換;使用 add 時,由于 hash 表中已經存在對應的記錄,所以 add 將被忽略。H

12、iterObject/*CreateInputDataSet*/datapatients;lengthpatient_id$16discharge8;inputpatient_iddischarge:DATE9.;datalines;Smith-412315MAR2004Hagen-283423APR2004Smith-243715JAN2004Flinn-294012FEB2004/*Loadanditerateoverhash*/data_null_;lengthpatient_id$16discharge8;declarehashht(dataset:patients,ordered:ascending);ht.defineKey(patient_id);ht.defineData(patient_id”,adischarge);ht.defineDone();declarehiteriter(h

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論