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. jboss规则引擎KIE Drools 6.3.0 Final 教程(3)

    在前2部教程中,介绍了如何在本地运行.drools文件以及使用stateless的方法访问远程repository上的规则. KIE Drools还提供了一种叫有状态-stateful的访问方式. 运 ...

  2. CentOS7: How to install Desktop Environments on CentOS 7?

    1. Installing GNOME-Desktop: Install GNOME Desktop Environment on here. # yum -y groups install &quo ...

  3. 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 ...

  4. Android 6.0出现的init: cannot execve(‘XXX’):Permission denied问题:禁止SELINUX的权限设置

    最近在开发MTK的相关项目,需要将一些可执行文件添加到init.rc文件里去,但是开机后发现,这个bin文件没有权限不能执行,于是我就在init.rc中对相应的bin文件增加了权限.后来发现,改了也没 ...

  5. Android必知必会-App 常用图标尺寸规范汇总

    若移动端访问不佳,请使用 –> Github版 内容持续更新中,更新日期:2016-08-11 1. 程序启动图标(icon launcher) 放在mipmap-*dpi下,文件名为ic_la ...

  6. 剑指Offer——求职必备神器

    剑指Offer--求职必备神器 前言   不管是公司网申.银行招聘.面试等等,"谈谈你的职业规划"."以往工作中遇到了哪些棘手问题?你是如何解决的?".&quo ...

  7. Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构

    转载请把头部出处链接和尾部二维码一起转载,本文出自: http://blog.csdn.net/hejjunlin/article/details/52435789 前面几节中,都是通过java层调用 ...

  8. JSP简单隔行变色和日期格式化

    以前好像在找,都没找到简单点的,所以后面就自己写了一个,感觉超级简单又好理解,分享给大家 <%@ page language="java" import="java ...

  9. Android播放在线音乐文件

    Android播放在线音频文件 效果图: 源码下载地址: http://download.csdn.net/detail/q4878802/9020687 添加网络权限: <uses-permi ...

  10. FORM打开网页链接

     DECLARE l_server_url VARCHAR2(100); l_parameters VARCHAR2(200); BEGIN fnd_profile.get('APPS_WEB_A ...