ABAP二分法(BINARY SEARCH)使用和注意事项

ABAP二分法(BINARY SEARCH)使用和注意事项

READ TABLE 命令使用顺序查找数据表,这会降低处理速度,而使用 BINARY SEARCH 理论上可以减少一半的运行时间。 在使用binary search之前必须首先将内表排序,否则有可能数据为空(下面会举个栗子),因为二分查找反复将查找区间对半划分,如果要查找的值小于查找区间的中间位置的数据项值,则查找区间将缩小到前半个区间,否则查找将局限于后半区间。

二分法的使用方法

  1. SORT itab BY id sex name. 一定要排序,read表时候匹配多少字段就要排序多少字段。一定要排序!!!!

  2. READ TABLE itab INTO DATA(gs_itab) WITH KEY id = 1 sex = 2 name = ‘1’ BINARY SEARCH.

有同学要问了,如果不排序或者关键字段排序不够会怎么样呢

下面我们来举个栗子
ABAP二分法(BINARY SEARCH)使用和注意事项_第1张图片
1.先建一个表,前2列,都相同的,但是注意最后一列为降序的。
ABAP二分法(BINARY SEARCH)使用和注意事项_第2张图片

2.我们不排序进行读取,读到数据显示name的数据,读不到显示状态
ABAP二分法(BINARY SEARCH)使用和注意事项_第3张图片
3.read语句的结果与内表:
ABAP二分法(BINARY SEARCH)使用和注意事项_第4张图片
ABAP二分法(BINARY SEARCH)使用和注意事项_第5张图片

我明明是有name 为1的数据为何读取不出来呢?这是因为没有进行排序与二分法的读取顺序(为升序:就是越来越大)逻辑相违背了。
1.二分法第一步,先读到name为3的数据(中间数据),发现条件name = 1 比 3小,排除name3以下的数据(二分法默认,name 3下面的数据都是比1大,故排除)
2.再读到name 4 和 name 5 ,发现没有数据 name为1的数据。
3.报错 sy-subrc = 4 ,所以数据为空。

结论:一定要排序!!!而且要把read语句上匹配字段都进行排序。
不排队就等着
ABAP二分法(BINARY SEARCH)使用和注意事项_第6张图片
对了~附上测试代码:

*定义个数据结构
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)使用和注意事项_第7张图片
参考链接
ABAP BINARY SEARCH–二分法
表情包来自于百度图片

你可能感兴趣的:(ABAP,abap)