【转载】SAS Hash 对象
2015-09-18 15:46
471 查看
Hash
对象
1.基本原理
散列表(Hash table,也叫哈希表),是根据关键码值(Key
value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
在数据装载时,根据F(key)=内存地址将表存到内存中指定的地址;
当要查找这个表中的数据时只要给定KEY值根据A=F(key)可以快速的得到的该key对应的内存地址直接进行取数,不用扫描整个表。
2.SAS中定义的HASH对象:
Hash对象的最基本的要点有三个:
(1)要放入内存中的表(2)用来通过hash函数建立与内存对应存储地址的KEY值(可以是数值、字符或者两者的混合,最好是表的主键否则只有第一条记录有效,因为key值相同通过F(key)只会指向一个地址)。
(3)要调入内存中与key值一起构成数组的变量.
3.在SAS中分别通过以下步骤来完成上述三个要点:
3.SAS中使用已经定义好的Hash表的方法有以下7种:
1)ADD
方法:增加指定的数据到hash中,数据中必须包括已经存在的hash的key值
rc=object.ADD();
rc:指定add方法是否成功,成功返回0,失败返回非0。下同 object:hash名。下同
KEY: keyvalue :指定增加的关键值,必须与已定义的hash中一致 DATA:
datavalue:指定增加的数据,必须与hash中一致
2)CHECK 方法:检查具体的key的取值是否已经存储在hash中
rc=object.CHECK();
例:rc = h.check(key: 'Joyce')
3)FIND
方法:查找给定key值的内存位置把对应的数据取出,以供接下来进行操作。
rc=object.FIND();
rc=h.find(key:'var1')
4)DELETE 方法:删除已经定义的hash
rc=object.DELETE( );
5)OUTPUT 方法:创造一个或多个数据集(数据包含在hash中) rc=object.OUTPUT(DATASET:
'dataset-1' <..., DATASET: 'dataset-n'>); DATASET:
'dataset' 指定输出的数据集名称
6)REMOVE
方法:移除hash中key的某个特定值(针对观测值/行) rc=object.REMOVE();
7)REPLACE
方法:替换hash中key的某个特定值后边所带的变量值(针对观测值/行)
rc=object.REPLACE();
8)Hash Iterator 方法
1)FIRST 方法:返回hash索引的第一个值 2)LAST
方法:返回hash索引的最后一个值 3)NEXT
方法:返回hash索引下一个值
4)PREV 方法:返回hash索引前一个值
9) h.num_items 返回唯一的key值数4.hash的使用实例
(1)通过hash可以实现表与表的高效关联
(2)可以对hash表中的数据进行控制设计巧妙的算法。下边是在网上搜集的一些具体的例子:
eg1.通过hash对数据集进行排序,并输出排序后的数据集
data test;
do i=1 to 10;
key=5+rannor(10)*3;
value=3+rannor(10)*2;
output;end; run; data _null_;
if _n_=0 then set test;
if _n_=1 then do;
declare hash h(dataset:'test',ordered:'ascending');
h.definekey('key'); h.definedata(all:'yes');
h.definedone();
end; rc=h.output(dataset:'test_order');
run;
eg3.主表调用hash表的数据(这个例子是从网上转载的,hash应用较为的经典案例,值得反复揣摩品味)
对象
1.基本原理
散列表(Hash table,也叫哈希表),是根据关键码值(Key
value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
在数据装载时,根据F(key)=内存地址将表存到内存中指定的地址;
key | value | 内存地址(举例) |
张三 | 87 | A1=F(张三)=18 |
李四 | 98 | A2=F( 李四)=20 |
王五 | 69 | A3= F(王五)=36 |
阮六 | 83 | A4= F(阮六)=48 |
2.SAS中定义的HASH对象:
Hash对象的最基本的要点有三个:
(1)要放入内存中的表(2)用来通过hash函数建立与内存对应存储地址的KEY值(可以是数值、字符或者两者的混合,最好是表的主键否则只有第一条记录有效,因为key值相同通过F(key)只会指向一个地址)。
(3)要调入内存中与key值一起构成数组的变量.
3.在SAS中分别通过以下步骤来完成上述三个要点:
3.SAS中使用已经定义好的Hash表的方法有以下7种:
1)ADD
方法:增加指定的数据到hash中,数据中必须包括已经存在的hash的key值
rc=object.ADD();
rc:指定add方法是否成功,成功返回0,失败返回非0。下同 object:hash名。下同
KEY: keyvalue :指定增加的关键值,必须与已定义的hash中一致 DATA:
datavalue:指定增加的数据,必须与hash中一致
2)CHECK 方法:检查具体的key的取值是否已经存储在hash中
rc=object.CHECK();
例:rc = h.check(key: 'Joyce')
3)FIND
方法:查找给定key值的内存位置把对应的数据取出,以供接下来进行操作。
rc=object.FIND();
rc=h.find(key:'var1')
4)DELETE 方法:删除已经定义的hash
rc=object.DELETE( );
5)OUTPUT 方法:创造一个或多个数据集(数据包含在hash中) rc=object.OUTPUT(DATASET:
'dataset-1' <..., DATASET: 'dataset-n'>); DATASET:
'dataset' 指定输出的数据集名称
6)REMOVE
方法:移除hash中key的某个特定值(针对观测值/行) rc=object.REMOVE();
7)REPLACE
方法:替换hash中key的某个特定值后边所带的变量值(针对观测值/行)
rc=object.REPLACE();
8)Hash Iterator 方法
1)FIRST 方法:返回hash索引的第一个值 2)LAST
方法:返回hash索引的最后一个值 3)NEXT
方法:返回hash索引下一个值
4)PREV 方法:返回hash索引前一个值
9) h.num_items 返回唯一的key值数4.hash的使用实例
(1)通过hash可以实现表与表的高效关联
(2)可以对hash表中的数据进行控制设计巧妙的算法。下边是在网上搜集的一些具体的例子:
eg1.通过hash对数据集进行排序,并输出排序后的数据集
data test;
do i=1 to 10;
key=5+rannor(10)*3;
value=3+rannor(10)*2;
output;end; run; data _null_;
if _n_=0 then set test;
if _n_=1 then do;
declare hash h(dataset:'test',ordered:'ascending');
h.definekey('key'); h.definedata(all:'yes');
h.definedone();
end; rc=h.output(dataset:'test_order');
run;
eg2.把哈希表中指定的观测输出或者做处理
eg3.主表调用hash表的数据(这个例子是从网上转载的,hash应用较为的经典案例,值得反复揣摩品味)
eg4.调用hash表自身数据进行计算
最后一个例子:data salaries; input empnum salary; format salary dollar10.;datalines;1234 1250003333 850004876 540005489 29000;;;;proc print data=salaries; title "SALARIES";run;
data brackets; input empnum tax_bracket;datalines;1111 0.281234 0.333333 0.284222 0.154876 0.25;;;;proc print data=brackets; title "BRACKETS";run;data netpay; attrib empnum length=8 salary length=8 format=dollar10. tax_bracket length=8 format=4.2 net_pay length=8 format=dollar10.;
retain default_bracket .10; drop default_bracket rc;
if _n_=1 then do; declare hash b(dataset:'brackets'); b.defineKey('empnum'); b.defineData('tax_bracket'); b.defineDone(); end;
set salaries;
rc=b.find(); if rc ne 0 or tax_bracket=. then tax_bracket=default_bracket;
net_pay=salary*(1-tax_bracket);run;
proc print data=netpay; title "Example 4.1 Related Technique 1 NETPAY Data Set Created with DATA Step";run;
相关文章推荐
- 【转载】word 查找与替换中的…
- SAS--Perl Regular Expressi…
- sql合并复杂的表
- 【转载】COMPRESS 函数【功能…
- 【转载】SAS INTNX详解
- 用R软件绘制中国分省市地图
- SYSFUNC
- 【转载】format 与宏
- 口译常用成语
- 【转载】Windows下编写R pack…
- 【转载】想让你的R跟C#一样可以实…
- Git客户端(Windows系统)的使用
- infile语句
- FLOWOVER/ MISSOVER/ TRUNCOVER/ S…
- SAS定义宏变量三种方法
- PROC REPORT基础
- excel 合并单元格内容
- SAS 中if和where的区别
- 折腾SAS数据集 -- “in=”选项…
- iOS RunLoop 初识