`
yzmduncan
  • 浏览: 330346 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

POJ2503两种解法:快速排序+二分查找与哈希表

阅读更多

    poj2503题目意思很简单:就像查找一本字典,根据输入的条目和要查询的单词,给出查询结果(每个单词长度不超过10)。这题有很多实现方式,最容易想到的就是map,但这是acm训练且stl里面的map速度不够快,那就要另谋出路。

    数据量为100,000。可以想到的是快排+二分,复杂度是O(nlog2n)。还有就是哈希,哈希查询时间是O(1),当然,还要考虑哈希冲突,设计合理的字符串哈希函数。

    首先是快排+二分,比较简单。

#include <iostream>
const int MAX = 100001;
typedef struct
{
	char e[11];
	char f[11];
}Entry;
Entry entry[MAX];
int i = 0;		//词典总条数

int cmp(const void *a, const void *b)
{
	return strcmp((*(Entry *)a).f, (*(Entry *)b).f);
}

int BinSearch(char c[])
{
	int low = 0, high = i - 1;
	int mid, t;
	while(low <= high)
	{
		mid = (low + high) / 2;
		t = strcmp(entry[mid].f, c);
		if(t == 0)
			return mid;
		else if(t == -1)
			low = mid + 1;
		else
			high = mid - 1;
	}
	return -1;
}

int main()
{
	char str[25];
	int index = -1;
	while(gets(str))
	{
		if(str[0] == '\0')
			break;
		sscanf(str,"%s%s",entry[i].e,entry[i].f);
		i++;
	}
	qsort(entry,i,sizeof(Entry),cmp);  
	while(gets(str))
	{
        index = BinSearch(str);
		if(index == -1)
			printf("eh\n");
		else
			printf("%s\n",entry[index].e);
	}
	return 0;
}

 

    对于字符串的哈希,在《算法艺术与信息学竞赛》推荐使用ELFHash函数。对于哈希冲突的处理,采用的是链表法(个人认为线性探测等效率不是很高)。

#include <iostream>

const int M = 149993;

typedef struct
{
	char e[11];
	char f[11];
	int next;
}Entry;
Entry entry[M];
int i = 1;		//词典总条数
int hashIndex[M];

int ELFHash(char *key)
{
    unsigned long h=0;
    while(*key)
    {
        h=(h<<4)+(*key++);
        unsigned long g=h&0Xf0000000L;
        if(g) h^=g>>24;
        h&=~g;
    }
    return h%M;
}

void find(char f[])
{
	int hash = ELFHash(f);
	for(int k = hashIndex[hash]; k; k = entry[k].next)
	{
		if(strcmp(f, entry[k].f) == 0)
		{
			printf("%s\n",entry[k].e);
			return;
		}
	}
	printf("eh\n");
}

int main()
{
	char str[22];
	while(gets(str))
	{
		if(str[0] == '\0')
			break;
		sscanf(str,"%s %s",entry[i].e,entry[i].f);
		int hash = ELFHash(entry[i].f);
		entry[i].next = hashIndex[hash];
		hashIndex[hash] = i;
		i++;
	}
	while(gets(str))
		find(str);
	return 0;
}

 

 

分享到:
评论

相关推荐

    POJ1002-487-3279【Hash+Qsort】

    这个题目结合了哈希表(Hash)和快速排序(Qsort)两种算法来解决问题。哈希表是一种数据结构,它提供了通过键(key)快速查找、添加和删除元素的能力,而快速排序是一种高效的排序算法,通常平均时间复杂度为O(n ...

    POJ2503-Babelfish

    【标题】"POJ2503-Babelfish"是一个来自北京大学在线判题系统(POJ,Problem Online Judge)的编程题目。该题目要求参赛者编写程序解决特定的算法问题,通过编程语言实现,然后提交代码以供系统自动评测。 【描述】...

    ACM常用算法及其相应的练习题.docx

    * 哈希表和二分查找等高效查找法 + poj3349, poj3274, poj2151, poj1840, poj2002, poj2503 * 哈夫曼树:poj3253 * 堆 * Trie树:静态建树、动态建树 + poj2513 四、简单搜索 * 深度优先搜索:poj2488, poj3083,...

    北大POJ初级题-数据结构:解题报告+AC代码

    北京大学在线判题系统POJ(Problem Online Judge)是许多编程爱好者和学习者锻炼算法技能的平台,特别是对于初学者,它提供了很多基础题目来帮助理解并应用数据结构。本资源包含的是北大POJ初级题目的解题报告以及...

    POJ算法题目分类

    * 哈希表和二分查找等高效查找法:哈希表和二分查找等高效查找法是指解决问题的高效查找算法,如 poj3349、poj3274、POJ2151、poj1840、poj2002、poj2503。 * 哈夫曼树:哈夫曼树是指解决问题的哈夫曼树算法,如 poj...

    经典 的POJ 分类

    - POJ 2002、POJ 2503:Hash表在实际问题中的运用。 ### 搜索算法 #### 深度优先搜索 (DFS) - **题目示例**: - POJ 2488、POJ 3083:利用DFS遍历图或树。 - POJ 3009、POJ 1321:基于DFS的问题求解。 #### ...

    poj题目分类

    * 哈希表和二分查找等高效查找法:例如 poj3349、poj3274、poj2151、poj1840、poj2002、poj2503。 * 哈夫曼树:例如 poj3253。 * 堆:例如 poj2513。 * trie 树:例如 poj2513。 4. 简单搜索: * 深度优先搜索...

    acm新手刷题攻略之poj

    - 哈希表可以用于快速查找和存储数据。 4. **树状数组** - 推荐题目:[poj3253](https://vjudge.net/problem/POJ-3253) - 树状数组(Binary Indexed Tree)常用于区间加、区间查询等问题。 5. **Trie树** - ...

    ACMer需要掌握的算法讲解 (2).docx

    * 哈希表和二分查找等高效查找法:POJ3349、POJ3274、POJ2151、POJ1840、POJ2002、POJ2503 * 哈夫曼树:POJ3253 * 背包问题:POJ1837、POJ1276 * DP算法:POJ3267、POJ1836、POJ1260、POJ2533 二、图算法 * 度限制...

    POJ1426-Find The Multiple【BFS+同余模】

    在代码实现上,`POJ1426-Find The Multiple【table】.cpp`可能包含了利用数组或哈希表来存储和查找结果的策略,而`POJ1426-Find The Multiple【BFS+同余模】.cpp`则是直接使用BFS和模运算的实现。文档`POJ1426-Find ...

    使用字典树和Hashtable两种方法解POJ 2503(JAVA)

    标题中的“使用字典树和Hashtable两种方法解POJ 2503”是指通过这两种数据结构解决一个特定的编程问题。POJ是Programming Online Judge的缩写,它是一个在线的编程竞赛平台,用户可以提交代码来解决特定的算法问题。...

    acm训练计划(poj的题)

    - 提供对排序和查找算法的理解与应用指导,包括快速排序、归并排序、二分查找等经典算法。 4. **贪心算法**: - (poj3295):讲解如何利用贪心策略来解决问题,强调每一步选择都是局部最优解。 5. **动态规划**:...

    POJ1691-Painting A Board 【拓扑+DFS】

    【标题】"POJ1691-Painting A Board 【拓扑+DFS】"是一个源自北京大学在线编程平台POJ的编程题目,它主要涉及到图论中的拓扑排序和深度优先搜索(DFS)算法。该题目的核心是解决一个与涂色相关的实际问题,通过运用...

    poj模拟题(二分查找)

    二分查找是一种高效的查找算法,其基本思想是将待查区间分成两个子区间,根据目标值与区间中间值的大小关系来决定继续查找左子区间还是右子区间,从而逐步缩小查找范围,直到找到目标值或者区间无法继续分割为止。二...

    POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】

    "POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】"涉及的是一道编程竞赛题目,主要考察参赛者的数据结构与算法应用能力,特别是Trie树(字典树)、并查集(MergeSet)以及欧拉路径(Euler Path)这三种数据...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **解释**:哈希表是一种常用的数据结构,用于快速查找和存储数据。 #### 4. 队列/栈 - **例题**:poj3253 - **解释**:队列和栈是两种常见的线性数据结构,用于存储和管理数据元素。 #### 5. Trie树 - **例题**...

    北京大学poj题目解题代码

    3. **排序与查找算法**:快速排序、归并排序、冒泡排序、二分查找、哈希查找等,这些都是编程竞赛中常见的算法。 4. **动态规划**:一种解决复杂问题的有效方法,通过将大问题分解为小问题并存储中间结果来避免重复...

    acm 分类 北大

    - 哈希表和二分查找:提高查找效率,如POJ2151。 - 哈夫曼树:用于数据压缩,如POJ3253。 - 堆:如POJ2299。 - Trie树:快速查找前缀,如POJ2513。 4. **搜索算法** - 深度优先搜索(DFS):遍历图或树的深...

    POJ2092:计数排序,求第K大的元素

    【标题】"POJ2092:计数排序,求第K大的元素"是一个编程题目,主要涉及计数排序算法以及如何在数组中找出第K大的元素。计数排序是一种非基于比较的排序算法,它适用于整数排序,尤其在数据范围不大的情况下效率极高。...

    强大的poj分类

    **简介**:基础算法是算法学习的基础,主要包括排序算法(如冒泡排序、选择排序、插入排序、归并排序、快速排序)、查找算法(如顺序查找、二分查找)、数学算法(如质数判断、最大公约数计算)等。 **重要性**:...

Global site tag (gtag.js) - Google Analytics