算法学习笔记(一)C++排序函数、映射技巧与字典树
1.头文件algorithm中有函数sort()用于排序,参数为:排序起始地址,排序结束地址,排序规则(返回bool型)
例如,要将array[] = {5,7,1,2,9}升序排列,则使用:
bool cmp(int a,int b);
int main()
{
int array[] = {5,7,1,2,9};
sort(array,array+5,cmp);
for(int i = 0;i < 5;i++)
cout << array[i] << " ";
cout << endl;
return 0;
} bool cmp(int a,int b)
{
if(a>b) return false;
else return true;
}
注:1.在C语言中,使用qsort进行排序。
2.如果不指定排序方式,默认为升序。
2.对于有序映射关系,可以用巧妙的办法转化,例如:
ABC对应2,DEF对应3,GHI对应4,JKL对应5,MNO对应6,PRS对应7,TUV对应8,WXY对应9
要把一串字符按照这样的规则映射为数字,可以采用以下方法:
(*(p+i) - 'A' - (*(p+i)>'Q'))/3 + 2
其中p为指向字符串的指针,因为每3个字母变化一次映射关系,因此只需要判断当前字符距离字符A的距离,然后除以三判断落在哪一组。需要注意的是字母Q不包含在映射关系当中,因此当字符在Q之后时,应该减去1个字符的距离再进行判断。
3.字典树是一种存放字符串的树形结构,又称为单词查找树,利用的是字符串的公共前缀来减少查询时间。需要注意的是字典树常常用于统计单词出现次数,而不是为了取出单词去存储单词。一般字典树的结构体如下:
struct DirectionTree{
int count;//计数到当前节点为止的单词个数
bool terminal;//记录此节点无子节点
DirectionTree* child[26];//该节点的子节点
}*root;//字典树的根节点,根节点不包含任何字母
字典树的存放方式为根连接子节点,子节点连接新的节点,一直连接到尾部。例如存储字符"abc","ad",则数据结构如下:
其中只有D3和D4两个节点的terminal值为true,count为1,其余的均为false,0。当再次添加同样的字符串时,不会创建新的节点,只会引起count加1。
完整代码如下(转):
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <assert.h>
using namespace std;
#define MAX 26 //the total number of alphabet is 26, a...z struct Dictree
{
bool word;
int count;
struct Dictree *trie[MAX]; // the 26 child
} * a; int init() // init the chained list
{
a = new Dictree;
for(int i = 0; i < MAX; i++)
{
a->trie[i] = NULL;
a->word = false;
} return 0;
} bool searchTrie(char *str)
{
int len, res;
Dictree *head = a;
assert(head);
len = strlen(str); for(int i = 0; i < len; i++)
{
res = (int)(str[i] - 'a');
if(head->trie[res] == NULL)
return false;
head = head->trie[res];
} if(head->word)
return true; return false;
} int insertTrie(char *str)
{
int len, res;
Dictree *head = a;
len = strlen(str); for(int i = 0; i < len; i++)
{
res = int(str[i] - 'a');
if(head->trie[res] == NULL) //whether the node exist?
{
head->trie[res] = new Dictree;
head = head->trie[res];
head->count = 0;
for(int j = 0; j < MAX; j++)
{
head->trie[j] = NULL;
head->word = false;
}
}
else
head = head->trie[res];
}
head->count++;
head->word = true; return head->count;
} int main()
{
char str[20]; init();
for(int i = 0; i < 10; i++)
{
scanf("%s", str);
printf("%d\n", insertTrie(str));
} scanf("%s", str);
printf("%s\n", searchTrie(str) ? ("YES"):("NO")); return 0;
}
算法学习笔记(一)C++排序函数、映射技巧与字典树的更多相关文章
- C语言排序算法学习笔记——交换类排序
交换类排序:根据序列中两个元素关键字的比较结果来交换他俩在序列中的位置. 冒泡排序:假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i])则交换他们 ...
- C语言排序算法学习笔记——插入类排序
排序就是讲原本无序的序列重新排序成有序的序列.序列里可以是一个单独数据,也可以是多个数据组合的记录,按照记录里的主关键字或者次关键字进行排序. 排序的稳定性:如果排序表中有两个元素R1,R2,其对应的 ...
- C语言排序算法学习笔记——选择类排序
选择排序:每一趟(例如第i趟)在后面n-i+1(i=1,2,3,……,n-1)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到n-1趟做完,待排序元素只剩下1个,就不用再选了. 简 ...
- C / C++算法学习笔记(8)-SHELL排序
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- 某科学的PID算法学习笔记
最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...
- Johnson 全源最短路径算法学习笔记
Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...
- Manacher算法学习笔记 | LeetCode#5
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...
- 《Algorithms算法》笔记:元素排序(4)——凸包问题
<Algorithms算法>笔记:元素排序(4)——凸包问题 Algorithms算法笔记元素排序4凸包问题 凸包问题 凸包问题的应用 凸包的几何性质 Graham 扫描算法 代码 凸包问 ...
随机推荐
- jboss规则引擎KIE Drools 6.3.0 Final 教程(3)
在前2部教程中,介绍了如何在本地运行.drools文件以及使用stateless的方法访问远程repository上的规则. KIE Drools还提供了一种叫有状态-stateful的访问方式. 运 ...
- CentOS7: How to install Desktop Environments on CentOS 7?
1. Installing GNOME-Desktop: Install GNOME Desktop Environment on here. # yum -y groups install &quo ...
- RDO Stack Exception: UnboundLocalError: local variable 'logFile' referenced before assignment
Issue: When you install RDO stack on CentOS, you may encounter following error. Error: [root@localho ...
- Android 6.0出现的init: cannot execve(‘XXX’):Permission denied问题:禁止SELINUX的权限设置
最近在开发MTK的相关项目,需要将一些可执行文件添加到init.rc文件里去,但是开机后发现,这个bin文件没有权限不能执行,于是我就在init.rc中对相应的bin文件增加了权限.后来发现,改了也没 ...
- Android必知必会-App 常用图标尺寸规范汇总
若移动端访问不佳,请使用 –> Github版 内容持续更新中,更新日期:2016-08-11 1. 程序启动图标(icon launcher) 放在mipmap-*dpi下,文件名为ic_la ...
- 剑指Offer——求职必备神器
剑指Offer--求职必备神器 前言 不管是公司网申.银行招聘.面试等等,"谈谈你的职业规划"."以往工作中遇到了哪些棘手问题?你是如何解决的?".&quo ...
- Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构
转载请把头部出处链接和尾部二维码一起转载,本文出自: http://blog.csdn.net/hejjunlin/article/details/52435789 前面几节中,都是通过java层调用 ...
- JSP简单隔行变色和日期格式化
以前好像在找,都没找到简单点的,所以后面就自己写了一个,感觉超级简单又好理解,分享给大家 <%@ page language="java" import="java ...
- Android播放在线音乐文件
Android播放在线音频文件 效果图: 源码下载地址: http://download.csdn.net/detail/q4878802/9020687 添加网络权限: <uses-permi ...
- FORM打开网页链接
DECLARE l_server_url VARCHAR2(100); l_parameters VARCHAR2(200); BEGIN fnd_profile.get('APPS_WEB_A ...