二分法 哈希表送上(详见sdut1480)

数据结构实验:哈希表

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

 在n个数中,找出出现次数最多那个数字,并且输出出现的次数。如果有多个结果,输出数字最小的那一个。

输入

 单组数据,第一行数字n(1<=n<=100000)。
接下来有n个数字,每个数字不超过100000000

输出

 出现次数最多的数字和次数。

示例输入

3
1 1 2

示例输出

1 2

#include<stdio.h>  
#include<string.h>  
#include<iostream>  
#include<algorithm>  
using namespace std;  
int cmp(int x,int y)  
{  
    return x<y;  
}  
int main()  
{  
    int n,a[100001],k=0,count=1,t;  
    scanf("%d",&n);  
    for(int i=0;i<n;i++)  
        scanf("%d",&a[i]);  
    sort(a,a+n,cmp);  
    for(int i=0;i<n;i++)  
    {  
        if(a[i]==a[i+1])  
        {  
  
            count=count+1;  
        }  
        else  {if(count>k) k=count,t=a[i];count=1;}  
    }  
    printf("%d %d\n",t,k);  
    return 0;  
}  



一、 设计课题:哈希表设计 二、 需求分析: 课题的目的和任务:根据数据元素的关键字和哈希函数建立哈希表并初始化哈希表,用开放定址法处理冲突,按屏幕输出的功能表选择所需的功能实现用哈希表对数据元素的插入,显示,查找,删除。 初始化哈希表时把elem[MAXSIZE]、elemflag[MAXSIZE]和count分别置0。创建哈希表时按哈希函数创建哈希表,输入数据元素的关键字时,以“0”结束输入且要求关键字为正整数,数据元素个数不允许超过表长MAXSIZE。 输出的形式:根据所选择的哈希表的功能输出相应提示语句和正确结果。 程序的功能:将一组个数不超过哈希表长度的数据元素,按其关键字和哈希函数存入哈希表中,如果产生冲突用开放定址法处理并找出相应的地址。能实现用哈希表对数据元素的插入,显示,查找,删除。 测试数据: maxsize=10 哈希函数:H(key)=key%7 处理冲突方法: 开放定址法 Hi=(H(key)+di)%13 i=1,2,3,…,9 三、实验概要设计: ADT HashTable { 数据对象:D1={ai|ai∈elem[MAXSIZE],i=0,1,2,…,0≦n≦MAXSIZE } elem [MAXSIZE]是哈希表中关键字的集合,MAXSIZE为哈希表长。} D2={ai|ai∈elemflag[MAXSIZE]是哈希表中有无关键字的标志的集合,MAXSIZE为哈希表长。} 基本操作: Hash(key) 初始条件:数据元素关键字key已存在 操作结果:根据哈希函数计算相应地址,并返回此地址。 InitialHash(HashTable &H) 初始条件:哈希表H已存在 操作结果:初始化哈希表把elem[MAXSIZE]、elemflag[MAXSIZE]和count分别置0。 SearchHash(HashTable &H,int k) 初始条件:哈希表H已存在 操作结果:在开放定址哈希表H中查找关键字为k的元素,若查找成功,并返回SUCCESS;否则返回UNSUCCESS。 InsertHash(HashTable &H,int e) 初始条件:哈希表H已存在 操作结果:查找不成功时插入数据元素e到开放定址哈希表H中,并返回SUCCESS;否则输出已有此数!插入失败!并返回UNSUCCESS。 CreateHash(HashTable &H) 操作结果:构造哈希表。 PrintHash(HashTable H) 初始条件:哈希表H已存在 操作结果:将哈希表存储状态显示输出。 DeleteHash(HashTable &H,int e) 初始条件:哈希表H已存在 操作结果:若通过哈希函数找到相应的位置并且此位置的elemflag[MAXSIZE]==1,删除相应位置的数据元素的关键字并把elemflag[MAXSIZE]==2,否则,输出无此数的提示语。 2. 本程序包括如下功能模块 哈希函数模块,冲突处理模块,哈希表初始化模块,哈希表创建模块,哈希表显示模块,按关键字查找模块,插入模块,删除模块和主程序模块。 四、基本操作的算法描述: 1.宏定义 #define MAXSIZE 10 #define SUCCESS 1 #define UNSUCCESS 0 2.数据类型、数据元素的定义 typedef struct { int elem[MAXSIZE]; int elemflag[MAXSIZE]; int count; }HashTable; 3. 哈希表的基本操作的算法描述 //初始化哈希函数 void InitialHash(HashTable &H)/*哈希表初始化*/ { int i; H.count=0; for(i=0;i<MAXSIZE;i++) { H.elem[i]=0; H.elemflag[i]=0; } } //哈希函数 int Hash(int kn) /*哈希函数H(key)=key MOD 7*/ { return (kn%7); } //查找函数 int SearchHash(HashTable &H,int k) /*查找关键字为k的元素*/ { int t,s; s=t=Hash(k); //调用哈希函数 xun: if(H.elem[t]==k&&H.elemflag[t]==1) return SUCCESS; //如果相应的地址上的数等于k,返回1 else if(H.elem[t]!=k&&H.elemflag[t]==1) { //相应地址有数但不等于k并且H.elemflag[t]==1 t=(t+1)%MAXSIZE; // 处理冲突 goto xun; } else return UNSUCCESS; //返回0 } //插入函数 int InsertHash(HashTable &H,int e)/*插入元素e*/ { int p; p=Hash(e); if(SearchHash(H,e) ) //调用查找函数,如果有此数返回1 { cout<<"已有此数!"<<endl; return UNSUCCESS; //插入是吧,返回0 } else //查找失败,返回0 { H.elemflag[p]=1; //把状态标志置1 H.elem[p]=e; //把关键字放入相应的地址 H.count++; //计数加1 return SUCCESS; //插入成功,返回1 } } //创建哈希表的函数 void CreateHash(HashTable &H)/*创建哈希表*/ { int s; int e; cout<<"请输入哈希表(输入0结束!)"<<endl; cin>>e; while(e) { s=InsertHash(H,e); //调用插入函数 if(!s) { cout<<"此数已存在!"; cin>>e; } else cin>>e; } } //显示函数 void PrintHash(HashTable H) /*显示元素及其位置*/ { cout<<"哈希表地址:"; int i; for(i=0;i<MAXSIZE;i++) cout<<i<<" "; cout<<endl<<"关键字: "; for(i=0;i<MAXSIZE;i++) cout<<H.elem[i]<<" "; cout<<endl<<"关键字标志:"; for(i=0;i<MAXSIZE;i++) cout<<H.elemflag[i]<<" "; } //删除函数 int DeleteHash(HashTable &H,int e) /*删除元素e*/ { int i; int a=0; for(i=0;i<MAXSIZE;i++) if(H.elem[i]==e&&H.elemflag[i]==1) { H.elemflag[i]=2; H.count--; H.elem[i]=0; a++; return SUCCESS; } if(!a) { cout<<"无此数!"<<endl; return UNSUCCESS; } } //主函数 void main() { HashTable H; int m,k,p; int R; do{ cout<<endl<<"\t\t******************请选择功能********************"<<endl; cout<<"\t\t\t1.初始化哈希表"<<endl<<"\t\t\t2.创建哈希表"<<endl<<"\t\t\t3.查找" <<endl<<"\t\t\t4.插入"<<endl<<"\t\t\t5.删除"<<endl<<"\t\t\t6.输出哈希表:"<<endl<<"\t\t\t0.退出"<<endl; cout<<"\t\t************************************************"<<endl; cin>>m; switch(m) { case 1: InitialHash(H);break; case 2: CreateHash(H);break; case 3: cout<<endl<<"请输入要查找的关键字:"; cin>>k; p=SearchHash(H,k); if(p) cout<<"查找成功!"<<endl; else cout<<"查找失败!"<<endl; break; case 4: cout<<endl<<"请输入要插入的关键字:"; cin>>R; p=InsertHash(H,R); if(p) cout<<"插入成功!"<<endl; else cout<<"插入失败!"<<endl; break; case 5: cout<<"请输出要删除的关键字:"; cin>>R; p=DeleteHash(H,R); if(p) cout<<"删除成功!"<<endl; else cout<<"删除失败!"<<endl; break; case 6: PrintHash(H);break; case 0: break; default: cout<<endl<<"选择错误!";break; }
<think>好的,我现在需要回答用户关于SAP哈希表和索引表使用的问题。首先,我得确保自己正确理解这两个概念,然后组织一个清晰的中文解释,符合用户提供的格式要求。 首先,哈希表(HASH Table)在SAP中应该是指一种用于快速数据访问的数据结构。根据计算机科学中的哈希表,它通过哈希函数将键映射到存储位置,从而实现高效的数据查找。在SAP系统中,哈希表可能被用于优化内部数据的访问速度,比如在数据库操作或内部程序处理时减少搜索时间。需要确认SAP中是否有特定的实现方式,比如是否使用开放寻址法或链地址法解决冲突,或者是否有特殊的配置参数。 然后是索引表(Index Table)。在SAP ABAP中,索引表通常指的是标准表和排序表,因为它们可以通过索引访问。标准表(STANDARD TABLE)使用线性搜索,而排序表(SORTED TABLE)允许二分法搜索。索引表在内部使用数组结构,可以通过INDEX关键字快速访问。需要解释索引表的特点,如访问方式、性能考虑以及使用场景。 接下来,我需要整理两者的区别和使用场景。哈希表适合通过键快速查找,而索引表适合需要按顺序或索引访问的情况。在ABAP中,哈希表对应的可能是HASHED TABLE类型,而索引表包括STANDARD和SORTED TABLE。需要提到声明方式,例如:DATA lt_hash TYPE HASHED TABLE OF ... WITH UNIQUE KEY ...,以及索引表的声明方式,如DATA lt_std TYPE STANDARD TABLE OF ... WITH NON-UNIQUE KEY ...。 还要注意用户提到的系统级指令,比如数学表达式用$...$,但这个问题可能不涉及数学公式,但需要确认是否需要举例时使用。例如,如果提到性能的时间复杂度,可能需要用大O符号,比如O(1)或O(log n),这些需要用行内公式格式。 需要确保回答结构清晰,分步骤或分点说明。可能的结构如下: 1. 哈希表的定义和用途 - 数据结构,键值对,哈希函数 - 在SAP中的应用场景,如快速查找 - 声明语法示例 - 特点:唯一键,快速访问,无序 2. 索引表的定义和用途 - 包括标准表和排序表 - 索引访问方式,性能差异 - 声明语法示例 - 特点:允许非唯一键,有序或无序 3. 对比与选择 - 哈希表vs索引表的性能比较 - 使用场景建议 - 示例代码片段(如果需要) 需要注意用户要求的中文回答,所以术语要准确,比如“哈希表”、“索引表”、“标准表”、“排序表”等。同时,可能需要提到在ABAP编程中的实际应用,比如在内部表操作时选择不同类型的表以提高效率。 另外,用户可能希望了解实际使用中的注意事项,比如哈希表键的唯一性要求,索引表的插入性能等。例如,哈希表在插入时需要确保键的唯一性,否则会引发错误;而标准表在大量数据时线性搜索可能较慢,适合使用索引访问或排序后使用二分法。 最后,检查是否符合所有系统级指令,特别是LaTeX格式是否正确,但这个问题可能较少涉及数学表达式,但如果有提到时间复杂度,需要用$O(1)$等格式。例如,哈希表的查找时间复杂度是$O(1)$,而排序表的二分查找是$O(\log n)$,标准表的线性查找是$O(n)$。 总结回答的结构,确保分点明确,语言简洁,正确无误。可能需要参考SAP ABAP官方文档或权威资料,确保信息的准确性。如果存在不确定的地方,应该指出或建议查阅具体文档,但尽量提供可靠的信息。</think>### SAP 哈希表与索引表的使用详解 #### 1. **哈希表(HASH Table)** - **定义** 哈希表是一种基于键值对(Key-Value)的数据结构,通过哈希函数将键映射到存储位置,实现快速数据访问。在SAP ABAP中,哈希表对应`HASHED TABLE`类型。 - **特点** - **唯一键约束**:键必须唯一,插入重复键会触发运行时错误。 - **快速查找**:通过键直接访问,时间复杂度为$O(1)$。 - **无序存储**:数据按哈希函数结果存储,无固定顺序。 - **使用场景** 适用于需要高频通过唯一键检索数据的场景,例如根据物料号(`MATNR`)快速查找物料详情。 - **声明语法** ```abap DATA: lt_hash TYPE HASHED TABLE OF mara WITH UNIQUE KEY matnr. "声明哈希表,键为matnr ``` --- #### 2. **索引表(Index Table)** - **定义** 索引表是可通过索引(Index)或键(Key)访问的内部表类型,包含**标准表(STANDARD TABLE)**和**排序表(SORTED TABLE)**两种。 - **分类与特点** - **标准表** - 使用线性搜索,查找时间复杂度为$O(n)$。 - 允许非唯一键,插入速度快(直接追加到末尾)。 - 声明示例: ```abap DATA: lt_std TYPE STANDARD TABLE OF mara WITH NON-UNIQUE KEY matnr. ``` - **排序表** - 数据按键升序存储,支持二分查找,查找时间复杂度为$O(\log n)$。 - 键可非唯一,但插入需维护顺序,速度较慢。 - 声明示例: ```abap DATA: lt_sorted TYPE SORTED TABLE OF mara WITH NON-UNIQUE KEY matnr. ``` --- #### 3. **对比与选型建议** | **特性** | **哈希表(HASHED)** | **标准表(STANDARD)** | **排序表(SORTED)** | |------------------|----------------------------|-----------------------------|------------------------------| | **键唯一性** | 必须唯一 | 允许非唯一 | 允许非唯一 | | **查找速度** | $O(1)$(最快) | $O(n)$(线性搜索) | $O(\log n)$(二分查找) | | **插入速度** | 中等(需计算哈希值) | $O(1)$(直接追加) | $O(n)$(需维护顺序) | | **适用场景** | 高频按键查询 | 高频插入/按索引访问 | 需按顺序访问或范围查询 | - **选型建议** - 若需**极速键查询**且键唯一 → 选择哈希表。 - 若需**频繁插入**或通过索引访问 → 选择标准表。 - 若需**有序数据**或范围查询 → 选择排序表。 --- #### 4. **示例代码** ```abap "哈希表插入与查询 DATA: ls_mara TYPE mara. ls_mara-matnr = '1001'. INSERT ls_mara INTO TABLE lt_hash. "插入数据 READ TABLE lt_hash WITH KEY matnr = '1001' INTO ls_mara. "查询 "排序表二分查找 READ TABLE lt_sorted WITH KEY matnr = '1001' BINARY SEARCH INTO ls_mara. ``` --- #### 5. **注意事项** - **哈希表冲突**:SAP内部自动处理哈希冲突,开发者无需干预。 - **排序表维护**:插入数据时需确保有序,否则需显式调用`SORT`语句。 - **性能权衡**:高频写入场景避免使用排序表,优先选择标准表。 通过合理选择表类型,可显著优化SAP程序性能。建议结合数据访问模式(读/写比例、键的唯一性)进行设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值