二分法检索(binary search)又称折半检索,其基本思想是设字典中的元素从小到大有序地存放在数组(array)中:
首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功;
否则,
若key小,则在字典前半部分中继续进行二分法检索;
若key大,则在字典后半部分中继续进行二分法检索。
这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。
二分法检索是一种效率较高的检索方法,要求字典在顺序表中按关键码排序。
READ TABLE it_gl_result INTO lv_gl_s WITH KEY racct = <fs_gl>-racct drcrk = 'S' BINARY SEARCH.
READ TABLE it_gl_result INTO lv_gl_h WITH KEY racct = <fs_gl>-racct drcrk = 'H' BINARY SEARCH.
实践分析:查询字段与排序字段顺序不符,将导致记录查找不到。
首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功;
否则,
若key小,则在字典前半部分中继续进行二分法检索;
若key大,则在字典后半部分中继续进行二分法检索。
这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。
二分法检索是一种效率较高的检索方法,要求字典在顺序表中按关键码排序。
对于二分查找,表必须根据特殊的搜索关键字来升序排列,否则这个搜索不会找到正确的行。
例子:
CLEAR: lv_gl_s,lv_gl_h.READ TABLE it_gl_result INTO lv_gl_s WITH KEY racct = <fs_gl>-racct drcrk = 'S' BINARY SEARCH.
READ TABLE it_gl_result INTO lv_gl_h WITH KEY racct = <fs_gl>-racct drcrk = 'H' BINARY SEARCH.
lv_gl_data-ba_amount = lv_gl_s-hslvt - ABS( lv_gl_h-hslvt ).
以上摘自:http://blog.csdn.net/wengyuyu1234/article/details/8185805
遇到的问题,分享如下:
- 求证对应:“对于二分查找,表必须根据特殊的搜索关键字来升序排列,否则这个搜索不会找到正确的行。”
实践证明:排序字段顺序,需与查询条件字段顺序一致,代码如下。
DATA:BEGIN OF lt OCCURS 0 ,
a(4) TYPE c,
b(4) TYPE c,
END OF lt.
lt-a(4) = '1'. lt-b(4) = '1'. APPEND lt.
lt-a(4) = '1'. lt-b(4) = '2'. APPEND lt.
lt-a(4) = '2'. lt-b(4) = '1'. APPEND lt.
lt-a(4) = '4'. lt-b(4) = '1'. APPEND lt.
lt-a(4) = '5'. lt-b(4) = '2'. APPEND lt.
lt-a(4) = '6'. lt-b(4) = '2'. APPEND lt.
lt-a(4) = '7'. lt-b(4) = '3'. APPEND lt.
SORT lt.
READ TABLE lt WITH KEY
"b(4) = '2' a(4) = '1' " result is N
a(4) = '1' b(4) = '2' " result is Y
BINARY SEARCH.
IF sy-subrc = 0.
WRITE 'Y'.
ELSE.
WRITE 'N'.
ENDIF.