ABAP二分法(BINARY SEARCH)使用和注意事项
READ TABLE 命令使用顺序查找数据表,这会降低处理速度,而使用 BINARY SEARCH 理论上可以减少一半的运行时间。 在使用binary search之前必须首先将内表排序,否则有可能数据为空(下面会举个栗子),因为二分查找反复将查找区间对半划分,如果要查找的值小于查找区间的中间位置的数据项值,则查找区间将缩小到前半个区间,否则查找将局限于后半区间。
二分法的使用方法
-
SORT itab BY id sex name. 一定要排序,read表时候匹配多少字段就要排序多少字段。一定要排序!!!!
-
READ TABLE itab INTO DATA(gs_itab) WITH KEY id = 1 sex = 2 name = ‘1’ BINARY SEARCH.
有同学要问了,如果不排序或者关键字段排序不够会怎么样呢
下面我们来举个栗子
1.先建一个表,前2列,都相同的,但是注意最后一列为降序的。
2.我们不排序进行读取,读到数据显示name的数据,读不到显示状态
3.read语句的结果与内表:
我明明是有name 为1的数据为何读取不出来呢?这是因为没有进行排序与二分法的读取顺序(为升序:就是越来越大)逻辑相违背了。
1.二分法第一步,先读到name为3的数据(中间数据),发现条件name = 1 比 3小,排除name3以下的数据(二分法默认,name 3下面的数据都是比1大,故排除)
2.再读到name 4 和 name 5 ,发现没有数据 name为1的数据。
3.报错 sy-subrc = 4 ,所以数据为空。
结论:一定要排序!!!而且要把read语句上匹配字段都进行排序。
不排队就等着
对了~附上测试代码:
*定义个数据结构
TYPES: BEGIN OF ty_ship,
id TYPE c ,
sex TYPE c,
name TYPE ernam,
END OF ty_ship.
DATA: itab TYPE TABLE OF ty_ship.
*给itab内表赋5条值
itab = VALUE #( ( id = '1' sex = '2' name = '5' )
( id = '1' sex = '2' name = '4' )
( id = '1' sex = '2' name = '3' )
( id = '1' sex = '2' name = '2' )
( id = '1' sex = '2' name = '1' )
) .
"SORT itab BY id. "把id进行升序排序
"SORT itab BY id sex name ."
READ TABLE itab INTO DATA(gs_itab) WITH KEY id = 1 sex = 2 name = '1' BINARY SEARCH.
IF sy-subrc = 0.
MESSAGE '读取到name:' && gs_itab-name TYPE 'I'.
ELSE.
MESSAGE '没有读到数据,状态:' && sy-subrc TYPE 'I'.
ENDIF.
CLEAR:gs_itab.
cl_demo_output=>display( itab )."快速窗口输出结果
分享使我快乐,请你不要吝啬点个赞评个论什么的
参考链接
ABAP BINARY SEARCH–二分法
表情包来自于百度图片