美文网首页
2019.4.24胡凡算法笔记

2019.4.24胡凡算法笔记

作者: sure_风雨与晴 | 来源:发表于2019-04-24 23:21 被阅读0次

const与#define的差异

(0) 相同

两者都可以用来定义常量;

  #define PI 3.14159 // 常量宏  
  const doulbe Pi=3.14159; // 常量

(1) 编译器处理方式不同

define宏是在预处理阶段展开;const常量是编译运行阶段使用;

(2) 类型和安全检查不同

define宏没有类型,不做任何类型检查,仅仅是展开。
const常量有具体的类型,在编译阶段会执行类型检查

(3) 存储方式不同

define宏在定义时不会分配内存;define宏仅仅是展开,有多少地方使用,就展开多少次;
const常量在定义时会在内存中分配(可以是堆中也可以是栈中);

(4) 赋值时的空间分配

const 可以节省空间,避免不必要的内存分配。 例如:

 #define PI 3.14159 //常量宏  
 const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......  
 double i=Pi; //此时为Pi分配内存,以后不再分配!  
 double I=PI; //编译期间进行宏替换,分配内存  
 double j=Pi; //没有内存分配  
 double J=PI; //再进行宏替换,又一次分配内存!  

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。

(5) 提高了效率

编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

algorithm头文件下的常用函数

使用algorithm头文件,需要在头文件下一行加一行"using namespace std;"。

  1. max(), min(), abs()
    max()和min()参数必须是两个。
    abs(x)返回x的绝对值,且x必须是整数。浮点型的绝对值可以用math头文件下的fabs。
  2. swap()
    swap(x, y)用来交换x,y的值
  3. reverse()
    reverse(it, it2)可以将数组指针在[it, it2)之间的元素进行反转。
int a[10] = {10, 11, 12, 13, 14, 15};
reverse(a, a+4);   //0~3逆转

输出:13 12 11 10 14 15
  1. next_permutation()
    next_permutation()给出一个序列在全排列中的下一个序列
#include <stdio.h>
#include <algorithm>
using namespace std;
int main()
{
  int a[10] = {1, 2, 3};
  do{
      printf("%d%d%d\n", a[0], a[1], a[2]);
  }while(next_permutation(a, a+3));
  return 0;
}

next_permutation()在到达全排列的最后一个时会返回false。
使用do...while循环是因为1 2 3序列也需要输出。

sort()

sort在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到O(n^2)的极端情况。

sort(首元素地址(必填), 尾元素地址的下一个地址(必填), 比较函数(非必填));

不写比较函数,则默认对前面的区间进行递增排序。

  1. 基本数据类型的排序函数
bool cmp(char a, char b)
{  
    return a > b;
}
....
sort(c, c+4, cmp);

从大到小就是左大右小,用“>”。

  1. 结构体数组的排序
struct node{
    int x, y;
}ssd[10];

//一级排序,按照x从大到小
bool cmp(node a, node b){
    return a.x > a.y;
}
sort(ssd, ssd+3, cmp);

//二级排序,x从大到小排序,且在x相等的情况下,按照y的大小从小到大排序。
bool cmp(node a, node b){
    if(a.x != b.x) return a,x > b.x;
    else return a.y < b.y;
}
sort(ssd, ssd+3, cmp);

相关文章

  • 2019.4.24胡凡算法笔记

    const与#define的差异 (0) 相同 两者都可以用来定义常量; (1) 编译器处理方式不同 defi...

  • 2019.4.10胡凡算法笔记

    1.N位数字与数组的转化 将N位数字的每一位存储在数组中 将数组中的数字组成N位数字 2.最大公约数和最小公倍数 ...

  • 2019.4.9胡凡算法笔记

    1.1 二维整点P的坐标映射 如何将二维整点P的坐标映射为一个整数,为一个整数,使得整点P可以由该整数唯一地代表。...

  • 2019.4.23胡凡算法笔记

    二维数组 如果数组较大(比如10^6级别),则需要将其定义在主函数外,否则会使程序异常退出。因为函数内部申请的局部...

  • 二叉树 | 哈夫曼树

    参考:胡凡,曾磊「算法笔记」,emmmmm算是梳理吧。图片和部分描述均来自此书~ 引:合并果子问题 n堆已知质量的...

  • AVL tree | 平衡二叉树

    参考:胡凡,曾磊《算法笔记》 引子 使用有序序列构建BST会形成链式的二叉树,此时查找的复杂度会达到O(n),达不...

  • 堆 | 定义、操作、堆排序

    参考:胡凡,曾磊《算法笔记》 定义 堆是一棵完全二叉树。 完全二叉树:结点数量n,叶子结点数ceiling(n/2...

  • Binary Search Tree | 二叉查找树

    参考书:胡凡、曾磊《算法笔记》 二叉查找树BST 又称为排序二叉树、二叉搜索树、二叉排序树 BST 是数据域有序的...

  • 二叉树 | 定义、性质、操作

    内容参考自胡凡,曾磊 《算法笔记》 二叉树的递归定义 递归边界:二叉树没有根结点,是一棵空树。 递归式:二叉树由根...

  • 算法笔记 晴神(胡凡等著) 完整pdf下载

    C/C++快速入门、入门模拟、算法初步、数学问题、C++标准模板库(STL)、数据结构专题(二章)、搜索专题、图算...

网友评论

      本文标题:2019.4.24胡凡算法笔记

      本文链接:https://www.haomeiwen.com/subject/eurwgqtx.html