1. ABAP,取内表中任意两数之和等于已知数,并输出相应的ID

本文介绍了一种ABAP编程语言中查找内表中任意两数之和等于已知数的方法,并输出对应的ID。通过循环遍历及条件判断实现,适用于需要进行数据匹配的场景。
*&---------------------------------------------------------------------*
*& Report  YZB_TEST4
*&
*&---------------------------------------------------------------------*
*&
*& ABAP,取内表中任意两数之和等于已知数,并输出相应的ID
*&---------------------------------------------------------------------*

report yzb_test4.

*-------------------------------------------------------------------*
*** DATA定义以下【
" 自定义内表
data: begin of lw_test,
        itm_no type n length 4,
        matnr type matnr_d,
        menge type menge_d,
        id    type n length 6,
      end of lw_test.
data: lt_test like table of lw_test.
data: lw_test1 like lw_test.
data: lw_test2 like lw_test.

" 循环变量
data: n type i value 1,
      w type i value 1,
      m type i value 1.

" 内表行数
data: line type i.

" 已知数
data: lv_menge type menge_d value 400.

" 查找标识
data: flag type c.
*** DATA定义以上】

*-------------------------------------------------------------------*
*** 逻辑处理以下【

" 添加内表数据
lw_test-itm_no = 10.
lw_test-matnr  = 'A'.
lw_test-menge  = 200.
lw_test-id     = 1.
append lw_test to lt_test.

lw_test-itm_no = 20.
lw_test-matnr  = 'A'.
lw_test-menge  = 100.
lw_test-id     = 2.
append lw_test to lt_test.

lw_test-itm_no = 30.
lw_test-matnr  = 'A'.
lw_test-menge  = 200.
lw_test-id     = 3.
append lw_test to lt_test.

" 计算内表行数
describe table lt_test lines line.

" 开始循环处理
do line   times.
  while m < line.
    read table lt_test into lw_test1 index n.
    w = w + 1.
    read table lt_test into lw_test2 index w.
    if lw_test1-menge + lw_test2-menge = lv_menge.
      write: lw_test1-id, lw_test2-id.
      flag = '1'.
      exit.
    endif.
    m = m + 1.
  endwhile.
  if flag = '1'.
    exit.
  endif.

  n = n + 1.
  m = n.
  w = n.
enddo.
*** 逻辑处理以上】

 

【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器状态空间平均模型的建模策略。该方法通过对系统中多个相互耦合的DC-DC变换器进统一建模,构建出整个微电网的集中状态空间模型,在此基础上实施线性化处理,便于后续的小信号分析与稳定性研究。文中详细阐述了建模过程中的关键步骤,包括电路拓扑分析、状态变量选、平均化处理以及雅可比矩阵的推导,最终通过Matlab代码实现模型仿真验证,展示了该方法在动态响应分析和控制器设计中的有效性。; 适合人群:具备电力电子、自动控制理论基础,熟悉Matlab/Simulink仿真工具,从事微电网、新能源系统建模与控制研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网中多变换器系统的统一建模方法;②理解状态空间平均法在非线性电力电子系统中的应用;③实现系统线性化用于稳定性分析与控制器设计;④通过Matlab代码复现和扩展模型,服务于科研仿真与教学实践。; 阅读建议:建议读者结合Matlab代码逐步理解建模流程,重点关注状态变量的选择与平均化处理学推导,同时可尝试修改系统参或拓扑结构以加深对模型通用性和适应性的理解。
<think>嗯,我现在得了解一下ABAP中的哈希和索引的区别。之前学过一点ABAP,但这两个概念还有点模糊。首先,哈希是什么?在ABAP里应该对应的是哪种类型呢?我记得ABAP有标准、排序和哈希这三种。标准是用索引访问的,排序也是索引但是有排序,而哈希应该是用哈希算法来快速访问的吧? 那哈希ABAP里的具体声明方式是怎样的呢?应该是用TYPE HASHED TABLE吧。声明的时候需要指定一个唯一键,这样系统才能根据这个键用哈希算法来存储据。这样的话,当用关键字访问哈希中的据时,速度会非常快,时间复杂度接近O(1),不需要像标准那样线性查找。 然后是索引,可能指的是标准和排序这两种,因为它们都是可以通过索引来访问的。标准的索引是线性的,插入据的时候会不断追加,而排序会根据关键字排序,所以插入的时候会有一定的开销,但查找的时候可以用二分法之类的更快方法。不过索引访问的话,比如用sy-tabix这样的系统变量,或者直接用INDEX INTO,应该都是直接按位置访问,所以速度很快,O(1)的时间复杂度。 那的方式有什么不同呢?哈希需要用关键字来读,比如READ TABLE ... WITH TABLE KEY ...,或者用哈希键的字段值。而索引可以用索引直接访问,比如READ TABLE ... INDEX ...。或者也可以用关键字,但这时候如果是标准的话,可能需要线性查找,效率较低,而排序的话可以用二分查找,所以更高效。 那什么时候该用哈希,什么时候用索引呢?比如如果需要频繁通过关键字来访问据,而且据量很大,哈希会更高效,因为它的查找时间是恒定的。而如果需要按索引顺序处理据,或者经常需要按位置插入或删除,可能用标准或排序更好。比如循环处理的时候用索引可能更方便,特别是需要知道当前号的情况。 不过可能要注意哈希的关键字必须是唯一的,否则无法正确存储。而标准和排序可以允许重复,除非特别指定UNIQUE关键字。排序在声明的时候如果指定了UNIQUE或者NON-UNIQUE的键,会影响据的插入和访问方式。 举个例子,比如有一个哈希,键是员工编号,这样当需要快速查找某个员工的信息时,用哈希可以直接通过员工编号获,不需要遍历整个。而如果有一个索引,比如按部门排序的排序,可能需要通过部门编号来查找,这时候用二分查找会比标准的线性查找更快,但可能还是不如哈希直接。 另外,哈希在内存中的存储方式可能更紧凑,或者根据哈希函分布,所以插入和删除的时间可能受负载因子影响,但ABAP可能已经处理好了这些底层细节。而索引在大量据时,如果频繁通过关键字查找,可能会有性能问题,这时候换成哈希会更好。 不过可能哈希在遍历的时候没有顺序,而索引比如排序是有序的,所以如果需要按顺序处理据,可能还是需要索引。比如报输出时需要按某个字段排序,这时候用排序会更方便,不需要每次都重新排序。 总结一下,哈希适合通过唯一键快速访问据的场景,而索引适合通过索引或需要顺序处理的场景。方式上,哈希必须用关键字,而索引可以用索引或关键字,但效率决于类型和查找方式。</think>在ABAP中,哈希(Hashed Table)和索引(Index Table)是两种重要的内类型,其底层实现和方式有显著差异。以下从效率、语法及适用场景逐步分析: --- ### **1. 哈希(Hashed Table)** #### **特点** - **声明方式**:需指定唯一键(`UNIQUE KEY`),例如: ```abap DATA: lt_employee TYPE HASHED TABLE OF zemployee WITH UNIQUE KEY emp_id. ``` - **底层结构**:基于哈希算法存储据,通过哈希函直接定位记录地址。 - **效率**:时间复杂度为 **O(1)**,适合大据量快速检索。 #### **语法** 必须通过**完整主键**访问: ```abap READ TABLE lt_employee WITH TABLE KEY emp_id = '001' ASSIGNING FIELD-SYMBOL(<ls_emp>). ``` #### **适用场景** - 高频通过唯一键查询(如根据ID查用户信息)。 - 无需遍历或顺序访问,仅需精准定位记录。 --- ### **2. 索引(标准、排序)** #### **类型对比** | 类型 | 声明示例 | 键特性 | 插入效率 | 查找效率 | |-----------|-----------------------------------|--------------|----------|----------------| | 标准 | `TYPE STANDARD TABLE` | 允许重复键 | O(1) | O(n)(线性扫描)| | 排序 | `TYPE SORTED TABLE` | 唯一/非唯一键| O(log n) | O(log n)(二分查找)| #### **方式** - **通过索引访问**(适用于标准、排序): ```abap READ TABLE lt_orders INDEX 3 ASSIGNING FIELD-SYMBOL(<ls_order>). ``` - **通过键值访问**(需显式指定键): ```abap READ TABLE lt_orders WITH KEY order_id = '1001' BINARY SEARCH. ``` - **`BINARY SEARCH`**:仅对排序有效,利用二分查找提升效率(O(log n))。 #### **适用场景** - **标准**:频繁插入/删除据,无需有序访问。 - **排序**:需按固定键顺序处理(如按日期生成报)。 --- ### **3. 性能对比示例** 假设内10,000条据: | 操作 | 哈希 | 标准(线性查找) | 排序(二分查找) | |--------------------|------------|-------------------|-------------------| | 按主键读单条记录 | **1次计算** | 平均5,000次循环 | 约14次比较 | --- ### **4. 选择建议** - **选哈希**:高频通过唯一键精准查询。 - **选标准**:频繁修改据或通过索引访问。 - **选排序**:需按有序键处理,且查询频率较高。 --- ### **总结** 哈希通过牺牲内存空间换极速查询,而索引通过物理顺序或二分查找平衡操作效率。实际开发中需根据据访问模式(键查询频率、顺序性需求)选择最合适的类型。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值