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

  • Post author:
  • Post category:其他




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.

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


下面我们来举个栗子


在这里插入图片描述

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–二分法


表情包来自于百度图片



版权声明:本文为lmf496891416原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。