QuickSort和Hash Table在Sum题目中的应用.

2024-03-14 03:38

本文主要是介绍QuickSort和Hash Table在Sum题目中的应用.,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  今天遇到了一道难题.题目如下:

Sum


Time limit:30 SecondsMemory limit:32768K Bytes
Submitted:375Accepted:44


Sum

Mr. Jojer is given n numbers and an extra integer x, he wants to know whether there are two numbers whose sum is x.

Input

The input file contains several test cases. The first line of each test case contains two integers, n(<=1000001) and x. From the next line of each test case, there are n numbers.

Output

Each test case corresponds to a line in the output, which is either "YES" if there exists an answer or "NO" if not.

Sample Input

3 3
1 2 3
2 3
1 3


Sample Output

YES
NO


Submit your solution

从题目的限制条件可以看出,要求要在1000001多个整数中查找两个其和为X的整数,其计算量是十分巨大的.而题目要求的是30秒中完成一批数目的测试(几组).如果采用一般的循环2阶相加比较,是现在完不成的.我这里有两套解决办法.

1.以内存换速度.
在为了提高运行速度的问题上,首先就应该想到的是以空间代价换取时间上的代价.最能体现这点的就是我们数据结构中所学习的Hash表.Hash表查找速度十分快,可能我们这里如何把Hash表应用进来呢?我采用了比较笨的办法.
循环每组数中的每个元素,首先检查其值是否存在Hash表中,如果存在,说明"YES"。否则将其 X - 元素 的值插入一个Hash表。那么这样下去,我只需要一个1阶的算法就能完成。不过这个Hash表十分巨大。不过,我们只需要把在一般范围内的整数放进Hash表记录,如果数值的范围超过了Hash能表示的范围,就单独出来存放在一个线性表中。
下面是我已经调试通过,并且在ACM Online Judge上Accpeted的源程序。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_N 3000002
long  integers[MAX_N];

char  regularTab[MAX_N];
long  extendTab[MAX_N];
long  numExt;

long n;
long x;


void insertTab(int a);
int  lookup(int a);

int main()
{
 long i,j;
 long m;
 int Yes;
 while(scanf("%ld%ld",&n,&x) == 2)
 {
  memset(regularTab,0,MAX_N);
  memset(extendTab,0,MAX_N*sizeof(long));
  numExt = 0;
  Yes = 0;

  for(i=0; i<n; i++)
  {
   scanf("%ld",&integers[i]);
  }

  for(i=0;i<n;i++)
  {
   if(lookup(integers[i]))
   {
    printf("YES/n");
    i = n;
    Yes = 1;
    break;
   }
   else
   {
    insertTab(x-integers[i]);
   }
  }
  if(Yes == 0)
   printf("NO/n");
 }

 return 1;
}

void insertTab(int a)
{
 if(a > -MAX_N/2 && a < MAX_N/2)
 {
  regularTab[a+MAX_N/2] = 1;
 }
 else
 {
  extendTab[numExt++] = a;
 }
}

int lookup(int a)
{
 if(a > -MAX_N/2 && a < MAX_N/2)
 {
  return regularTab[a+MAX_N/2];
 }
 else
 {
  long i;
  for(i=0;i<numExt; i++)
  {
   if(extendTab[i] == a)
    return 1;
  }
  return 0;
 }
}

2.使用QuickSort和qsort函数
快速排序的算法不用在这里多讲了。在C语言的stdlib.h中已经提供了一个汇编级别的qsort函数。这道题目使用快速排序的办法就是让所有的数列先排序,然后再进行查找。虽然排序也是二阶算法,但是由于QuickSort的特殊性,使得排序的过程还是比较快,一旦排序完成后,根据X进行二分查找,几步就可以完成了。具体的实现程序我这里没有。不过我觉得qsort的函数使用是十分重要的,所以我从msdn上抄袭了qsort函数的示例代码。

void qsort(
   void *base,
   size_t num,
   size_t width,
   int (__cdecl *compare )(const void *, const void *) 
);
Example
// crt_qsort.c
// arguments: every good boy deserves favor
/* This program reads the command-line
* parameters and uses qsort to sort them. It
* then displays the sorted arguments.
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int compare( const void *arg1, const void *arg2 );
int main( int argc, char **argv )
{
int i;
/* Eliminate argv[0] from sort: */
argv++;
argc--;
/* Sort remaining args using Quicksort algorithm: */
qsort( (void *)argv, (size_t)argc, sizeof( char * ), compare );
/* Output sorted list: */
for( i = 0; i < argc; ++i )
printf( " %s", argv[i] );
printf( "/n" );
}
int compare( const void *arg1, const void *arg2 )
{
/* Compare all of both strings: */
return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );
}
Output
 boy deserves every favor good

                                    

这篇关于QuickSort和Hash Table在Sum题目中的应用.的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/807098

相关文章

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

MySQL的ALTER TABLE命令的使用解读

《MySQL的ALTERTABLE命令的使用解读》:本文主要介绍MySQL的ALTERTABLE命令的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、查看所建表的编China编程码格式2、修改表的编码格式3、修改列队数据类型4、添加列5、修改列的位置5.1、把列

Python Flask 库及应用场景

《PythonFlask库及应用场景》Flask是Python生态中​轻量级且高度灵活的Web开发框架,基于WerkzeugWSGI工具库和Jinja2模板引擎构建,下面给大家介绍PythonFl... 目录一、Flask 库简介二、核心组件与架构三、常用函数与核心操作 ​1. 基础应用搭建​2. 路由与参