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",则数据结构如下:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/49/E4/wKiom1QeTZfwrCSjAAEA2r9xqMQ124.jpg" title="1.png" alt="wKiom1QeTZfwrCSjAAEA2r9xqMQ124.jpg" />

其中只有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++排序函数、映射技巧与字典树的更多相关文章

  1. C语言排序算法学习笔记——交换类排序

    交换类排序:根据序列中两个元素关键字的比较结果来交换他俩在序列中的位置. 冒泡排序:假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i])则交换他们 ...

  2. C语言排序算法学习笔记——插入类排序

    排序就是讲原本无序的序列重新排序成有序的序列.序列里可以是一个单独数据,也可以是多个数据组合的记录,按照记录里的主关键字或者次关键字进行排序. 排序的稳定性:如果排序表中有两个元素R1,R2,其对应的 ...

  3. C语言排序算法学习笔记——选择类排序

    选择排序:每一趟(例如第i趟)在后面n-i+1(i=1,2,3,……,n-1)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到n-1趟做完,待排序元素只剩下1个,就不用再选了. 简 ...

  4. C / C++算法学习笔记(8)-SHELL排序

    原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...

  5. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  6. 某科学的PID算法学习笔记

    最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...

  7. Johnson 全源最短路径算法学习笔记

    Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...

  8. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  9. 《Algorithms算法》笔记:元素排序(4)——凸包问题

    <Algorithms算法>笔记:元素排序(4)——凸包问题 Algorithms算法笔记元素排序4凸包问题 凸包问题 凸包问题的应用 凸包的几何性质 Graham 扫描算法 代码 凸包问 ...

随机推荐

  1. 有没有最好的学习Angularjs2的视频入门体验?

    Which are the best video tutorials for learning AngularJS 2? 有没有最好的学习Angularjs2的视频入门体验? 翻译来源:https:/ ...

  2. cassandra 并发技术介绍

    摘要 本文主要介绍cassandra线程技术,cassandra的实现是基于java的,所以线程技术使用的也是jdk包提供的线程类.cassandra是分布式数据库,整个并发架构是基于阶段事件驱动架构 ...

  3. Scikit-learn:分类classification

    http://blog.csdn.net/pipisorry/article/details/53034340 支持向量机SVM分类 svm分类有多种不同的算法.SVM是非常流行的机器学习算法,主要用 ...

  4. J2EE进阶(十八)基于留言板分析SSH工作流程

    J2EE进阶(十八)基于留言板分析SSH工作流程   留言板采用SSH(Struts1.2 + Spring3.0 + Hibernate3.0)架构.   工作流程(以用户登录为例):   首先是用 ...

  5. NuGet包断线续传下载

    NuGet包断线续传下载(金庆的专栏)NuGet是VC的扩展,用来下载依赖包.NuGet下载没有断线续传,下载源又很容易断开.  https://nuget.org/api/v2/  https:// ...

  6. 用户创建,删除and并发注册and系统登陆的API研究(学习汇总网上资料)

    一.系统登陆链接实现 比如有一个外围支持系统,用户需要在外围系统登录之后点个link就可以登录到Oracle ERP系统中,那么我们需要先把外围系统的用户创建在Oracle ERP中,并且分配职责给他 ...

  7. J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP

    J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP 前言   搜狐畅游笔试题中有一道问答题涉及到回答谈谈对Spring IOC与AOP的理解.特将相关内容进行整理.    ...

  8. 迎战大数据-Oracle篇

    来自:http://www.cnblogs.com/wenllsz/archive/2012/11/16/2774205.html 了解大数据带来的机遇: 透视架构与工具: 开源节流,获得竞争优势. ...

  9. Centos6.6上源码安装Nodejs V4版本

    本来就是想在vps上装一个Ghost博客,这个博客依赖的是Nodejs,然后推荐的是V4版本.然后我就对着官网的步骤安装,发现根本没有Centos6 i386的资源了(64位的还是有的), 我只能在那 ...

  10. 使用Broadcast实现android组件之间的通信

    android组件之间的通信有多种实现方式,Broadcast就是其中一种.在activity和fragment之间的通信,broadcast用的更多本文以一个activity为例. 效果如图: 布局 ...