在相同 table 上循环时二进制搜索不起作用
Binary search not working when looping on the same table
我正在制作一个导出 table 和一些数据 T_DATA[] 的函数。
当我循环遍历内部 table( T_ENTRIES[]) 并在 T_DATA[] 上使用二进制搜索时,有一部分。
在循环之前,T_DATA[] 按我在 read 语句中使用的键排序。
出于某种原因,即使在 tables.
中具有相同的键,读取也会失败很多时间
如果我删除二进制搜索,它会很好用。
这是在函数中声明为导出的 table 的常见问题吗?
因为当我将 table (T_DATA[]) 移动到不同的内部 table 并对其使用二进制搜索时,它工作正常。
谢谢!
SORT t_patient_list[] BY kunnr.
LOOP AT lt_cov_entry[] ASSIGNING FIELD-SYMBOL(<ls_cov_entry>).
READ TABLE t_patient_list[]
ASSIGNING FIELD-SYMBOL(<fs_patient_list>)
WITH KEY kunnr = <ls_cov_entry>-kunnr.
BINARY SEARCH.
IF sy-subrc <> 0.
CLEAR ls_patient_record.
MOVE-CORRESPONDING <ls_cov_entry> TO ls_patient_record.
APPEND ls_patient_record TO t_patient_list[].
ELSE.
<fs_patient_list>-hosp_type = <ls_cov_entry>-hosp_type.
ENDIF.
ENDLOOP.
问题是您在阅读时附加到 table。追加内容后,它可能不再被排序,因此 BINARY SEARCH
无法再可靠地工作。
可能的解决方法:
当 table t_patient_list
的定义在您的控制之下时,然后将辅助排序的 table 键添加到其声明中:
DATA t_patient_list TYPE TABLE OF patients
WITH NON-UNIQUE SORTED KEY key_kunnr COMPONENTS kunnr.
(当您可以保证 kunnr
仅包含唯一值时,您可能会使用更快的 UNIQUE HASHED KEY
)
然后在搜索时明确使用该键:
READ TABLE t_patient_list[]
ASSIGNING FIELD-SYMBOL(<fs_patient_list>)
WITH TABLE KEY key_kunnr COMPONENTS kunnr = <ls_cov_entry>-kunnr.
(此处不需要添加 BINARY SEARCH
,因为使用排序键意味着二进制搜索)。
每当 table 更改时,辅助键都会更新,因此您可以相信它们会保持一致。
更多骇人听闻的解决方法
当tablet_patient_list
的定义不在你的控制之下,那你就得re-sorttable 更改后:
IF sy-subrc <> 0.
CLEAR ls_patient_record.
MOVE-CORRESPONDING <ls_cov_entry> TO ls_patient_record.
APPEND ls_patient_record TO t_patient_list[].
SORT t_patient_list[].
ELSE.
但您可能想要衡量在每次追加后对其进行排序的性能损失是否不超过使用 BINARY SEARCH
.
节省的性能损失
它不适用于 BINARY SEARCH
,因为 APPEND
会破坏排序。最好的解决方案是通过kunnr
将t_patient_list
定义为SORTED
。 1
如果您不能这样做,您应该使用 INSERT ... INDEX sy-tabix
而不是 APPEND
,因为即使失败的 READ TABLE
也会将其设置为正确的值:
SORT t_patient_list[] BY kunnr.
LOOP AT lt_cov_entry[] ASSIGNING FIELD-SYMBOL(<ls_cov_entry>).
READ TABLE t_patient_list[]
ASSIGNING FIELD-SYMBOL(<fs_patient_list>)
WITH KEY kunnr = <ls_cov_entry>-kunnr
BINARY SEARCH.
IF sy-subrc <> 0.
CLEAR ls_patient_record.
MOVE-CORRESPONDING <ls_cov_entry> TO ls_patient_record.
INSERT ls_patient_record INTO t_patient_list[] INDEX sy-tabix.
ELSE.
<fs_patient_list>-hosp_type = <ls_cov_entry>-hosp_type.
ENDIF.
ENDLOOP.
1 ) 如果可以改成SORTED,还是要把APPEND换成INSERT,只是去掉INDEX部分。
我正在制作一个导出 table 和一些数据 T_DATA[] 的函数。 当我循环遍历内部 table( T_ENTRIES[]) 并在 T_DATA[] 上使用二进制搜索时,有一部分。 在循环之前,T_DATA[] 按我在 read 语句中使用的键排序。 出于某种原因,即使在 tables.
中具有相同的键,读取也会失败很多时间如果我删除二进制搜索,它会很好用。
这是在函数中声明为导出的 table 的常见问题吗?
因为当我将 table (T_DATA[]) 移动到不同的内部 table 并对其使用二进制搜索时,它工作正常。
谢谢!
SORT t_patient_list[] BY kunnr.
LOOP AT lt_cov_entry[] ASSIGNING FIELD-SYMBOL(<ls_cov_entry>).
READ TABLE t_patient_list[]
ASSIGNING FIELD-SYMBOL(<fs_patient_list>)
WITH KEY kunnr = <ls_cov_entry>-kunnr.
BINARY SEARCH.
IF sy-subrc <> 0.
CLEAR ls_patient_record.
MOVE-CORRESPONDING <ls_cov_entry> TO ls_patient_record.
APPEND ls_patient_record TO t_patient_list[].
ELSE.
<fs_patient_list>-hosp_type = <ls_cov_entry>-hosp_type.
ENDIF.
ENDLOOP.
问题是您在阅读时附加到 table。追加内容后,它可能不再被排序,因此 BINARY SEARCH
无法再可靠地工作。
可能的解决方法:
当 table t_patient_list
的定义在您的控制之下时,然后将辅助排序的 table 键添加到其声明中:
DATA t_patient_list TYPE TABLE OF patients
WITH NON-UNIQUE SORTED KEY key_kunnr COMPONENTS kunnr.
(当您可以保证 kunnr
仅包含唯一值时,您可能会使用更快的 UNIQUE HASHED KEY
)
然后在搜索时明确使用该键:
READ TABLE t_patient_list[]
ASSIGNING FIELD-SYMBOL(<fs_patient_list>)
WITH TABLE KEY key_kunnr COMPONENTS kunnr = <ls_cov_entry>-kunnr.
(此处不需要添加 BINARY SEARCH
,因为使用排序键意味着二进制搜索)。
每当 table 更改时,辅助键都会更新,因此您可以相信它们会保持一致。
更多骇人听闻的解决方法
当tablet_patient_list
的定义不在你的控制之下,那你就得re-sorttable 更改后:
IF sy-subrc <> 0.
CLEAR ls_patient_record.
MOVE-CORRESPONDING <ls_cov_entry> TO ls_patient_record.
APPEND ls_patient_record TO t_patient_list[].
SORT t_patient_list[].
ELSE.
但您可能想要衡量在每次追加后对其进行排序的性能损失是否不超过使用 BINARY SEARCH
.
它不适用于 BINARY SEARCH
,因为 APPEND
会破坏排序。最好的解决方案是通过kunnr
将t_patient_list
定义为SORTED
。 1
如果您不能这样做,您应该使用 INSERT ... INDEX sy-tabix
而不是 APPEND
,因为即使失败的 READ TABLE
也会将其设置为正确的值:
SORT t_patient_list[] BY kunnr.
LOOP AT lt_cov_entry[] ASSIGNING FIELD-SYMBOL(<ls_cov_entry>).
READ TABLE t_patient_list[]
ASSIGNING FIELD-SYMBOL(<fs_patient_list>)
WITH KEY kunnr = <ls_cov_entry>-kunnr
BINARY SEARCH.
IF sy-subrc <> 0.
CLEAR ls_patient_record.
MOVE-CORRESPONDING <ls_cov_entry> TO ls_patient_record.
INSERT ls_patient_record INTO t_patient_list[] INDEX sy-tabix.
ELSE.
<fs_patient_list>-hosp_type = <ls_cov_entry>-hosp_type.
ENDIF.
ENDLOOP.
1 ) 如果可以改成SORTED,还是要把APPEND换成INSERT,只是去掉INDEX部分。