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

相关文章

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

Java Stream 的 Collectors.toMap高级应用与最佳实践

《JavaStream的Collectors.toMap高级应用与最佳实践》文章讲解JavaStreamAPI中Collectors.toMap的使用,涵盖基础语法、键冲突处理、自定义Map... 目录一、基础用法回顾二、处理键冲突三、自定义 Map 实现类型四、处理 null 值五、复杂值类型转换六、处理

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We