![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
红鱼鱼
这个作者很懒,什么都没留下…
展开
-
二叉树的Morris遍历——传说中的神级遍历算法
常用的二叉树遍历主要分为深度优先遍历(dfs)和广度优先遍历(bfs),其中dfs又有前序、中序、后序遍历之分。然而不管你用迭代还是递归的方法实现,它们的空间复杂度都为O(N)。而本文介绍的Morris算法,只需O(1)的空间复杂度,本质上是使用时间换取空间的一种方法。假设我们要遍历如下二叉树: 如果采用中序遍历,那么遍历顺序应该为1 2 3 4 5 6 7 8 9 10,...原创 2020-04-06 22:10:04 · 472 阅读 · 1 评论 -
只是一篇超详细的c++ set用法总结罢了
set是STL中一种标准关联容器,它底层使用平衡的搜索树——红黑树实现。使用时需要包含头文件<set>。set在插入数据时会自动对数据进行排序,set中的元素不能重复,与此相对应的multiset中的元素可用重复。不能通过set的迭代器改变元素值,也不能通过[ ]的方式访问元素,其迭代器没有+1,-1的操作,。myset.begin()//指向myset第一个元素的迭代器...原创 2020-03-22 14:16:49 · 3298 阅读 · 4 评论 -
【C++】gcd函数的写法
gcd函数简介大公因数(英语:highest common factor,hcf)也称最大公约数(英语:greatest common divisor,gcd)是数学词汇,指能够整除多个整数的最大正整数。而多个整数不能都为零。例如8和12的最大公因数为4。求两个整数最大公约数主要的方法:1.穷举法:分别列出两整数的所有约数,并找出最大的公约数。2.素因数分解:分别列出两数的素因数分解式,...转载 2020-03-21 10:57:51 · 41307 阅读 · 5 评论 -
c++ nth_element用法
nth_element实际上就是快速选择算法的实现,快速选择算法实现原理具体见这里。void nth_element (Iterator first, Iterator first+nth, Iterator last, Compare comp);重新排列range[first,last)中的元素,使第n个位置的元素是按排序顺序在该位置的元素。其他元素没有任何特定的顺序,只是第n个元...原创 2020-03-20 11:41:00 · 3102 阅读 · 0 评论 -
快速选择算法
简介在构造kd-tree中,我们需要对方差最大维度上的中位数进行计算。中位数计算方法的好坏一定程度上影响了树的构造时间。要计算中位数,我们一般想到的是将数据进行排序,然后取中间的数。排序算法最快的时间复杂度为O(nlogn)。但是实际上我们要求中位数,不需要将所有数据进行排序,有的排序步骤是无用的。所以有了选择算法,其平均时间复杂度为O(n),最坏时间复杂度为O(n2)。在Rob Hess 的s...原创 2019-10-23 12:16:00 · 11438 阅读 · 2 评论 -
BFPRT算法(TOP-K问题)
这个算法第一次我是在sift源码里面看见的,之前一直不知道叫什么名字,知道无意间看到一篇博客,才发现了BFPRT的大名。这个名字就挺奇怪的,那是因为该算法由Blum、Floyd、Pratt、Rivest、Tarjan提出,所以就叫BFPRT。。。此算法可以用来求元素中第k大(或小)的值或是前k大(或小)的值。个人感觉它是对快速选择算法的一种改进,快速选择算法又是基于快速排序的思想。因此本文从快...原创 2020-03-02 09:37:20 · 879 阅读 · 3 评论 -
c++ sort与stable_sort的区别与自定义排序的使用
sort的实现是基于快速排序的,快速排序在比较算法中算是速度最快的,平均的时间复杂度为O(nlogn),虽然它的最差时间复杂度可能达到O(n2)。stable_sort的实现是基于归并排序的,它的时间复杂度为O(nlogn),一般情况下,它比快速排序稍慢。但是它是一种稳定排序,所谓稳定排序,就是说相同大小的元素,在排序前后的相对位置不会发生改变。即相同大小的元素中,原来在前的元素,排序之后还是...原创 2020-02-28 12:16:23 · 1934 阅读 · 0 评论 -
c++大小写字符、数字的判断及转换函数
1.isalpha(),用来判断一个字符是否为字母,如果是字符则返回非零,否则返回零。2.isalnum(),用来判断一个字符是否为数字或者字母,也就是说判断一个字符是否属于a~z||A~Z||0~9。是返回非零,不是返回0。3.islower(),用来判断一个字符是否为小写字母,也就是是否属于a~z。是返回非零,不是返回0。4.isupper(),用来判断一个字符是否为大写字母。是...原创 2020-02-24 21:06:41 · 17448 阅读 · 3 评论 -
c++中int与char,string的相互转换
1.ASCLL表图中包含的可显示字符不一定全,比如在vs2017中,ASCLL码为1的字符也是可以打印的(意外发现)。这里我们主要关注的是0-9对应的ASCLL码值为48-57.2.char转int在char类型字符相减时,结果会自动转为int型:char a = '1';cout << typeid(a - '0').name() << end...原创 2020-02-23 21:16:46 · 1782 阅读 · 0 评论 -
c++ string超详细总结
构造函数:string s1(""); // si = ""string s2("Hello"); // s2 = "Hello"string s3(4, 'K'); // s3 = "KKKK"string s4("12345", 1, 3); //s4 = "234",即 "12345" 的从下标 1 开始,长度为 3 的子串赋值:string s1;s1...原创 2020-02-22 14:46:51 · 2337 阅读 · 8 评论 -
c++ 使用map导致死循环的坑
(1)leetcode里1346题给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。更正式地,检查是否存在两个下标 i 和 j 满足:i != j 0 <= i, j < arr.length arr[i] == 2 * arr[j]class Solution {public: bool ...原创 2020-02-21 22:08:58 · 1627 阅读 · 0 评论 -
c++ STL map使用详细总结
对组对组(pair)是将两个值合成一个值,这两个值可以具有不同的数据类型,可以分别pair的两个公有函数first和second访问。类模板:template<class T1,class T2>struct pair.对组的创建有三种方法:pair<string,int>pair1(string("name"),20);pair<string,i...原创 2020-02-15 11:29:35 · 2096 阅读 · 6 评论 -
c++数组初始化总结
静态数组://一维数组int a[10];//定义了长度为10的数组,并未对值进行初始化int a[10]={};//定义了长度为10的数组,并将所有值初始化为0int a[10] = {1,2};//定义了长度为10的数组,前两个位置初始化值为1,2,其余位置初始化值为0//二维数组int a[10][9];//定义了10×9的数组,并未对值进行初始化int a[10][9]=...原创 2020-02-14 11:29:10 · 2173 阅读 · 2 评论 -
c++中vector[]和vecter.at()的区别
我们先定义一个数组vector<int>v(10),v[]和v.at()都可以对v中元素进行访问,一般大家使用的都是v[]这种访问方法,以至于我一度都将v.at()这种访问方式忘记了。不过这两种访问元素的方式有什么区别呢?.v[]和v.at()都可以对v中元素进行访问,并且访问的元素时都不能越界,比如a[10]或a.at(10)这样的使用会报错。区别在于,operator[]不做边...原创 2020-02-13 13:44:33 · 8773 阅读 · 1 评论 -
异或运算原理及使用
异或,英文为exclusive OR,缩写成xor。异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:a⊕b = (¬a ∧ b) ∨ (a ∧¬b)(¬为非)异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)...原创 2020-02-08 15:22:45 · 16630 阅读 · 4 评论 -
C++ STL vector使用总结
vector是C++标准模板库中的部分内容,中文偶尔译作“容器”。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。使用时需要包含头文件<vector>。1.vector初始化1.1vector初始化主要有三种方法。(1)vector <type> a; 不初始化容器(本文就容...原创 2020-02-07 18:48:07 · 716 阅读 · 2 评论 -
vector.size()导致死循环的坑
首先我是在for循环中遇到的这个问题:for(int i=0;i<vector.size()-1;i++){ xxx}当vector为空时,即vector.size为0时,按道理应该不会进入循环,不过实际中代码会进入for语句中并且产生死循环。我把代码作如下修改之后就不会进入for循环:int s=vector.size()-1for(int i=0;i&l...原创 2020-02-05 11:59:52 · 2676 阅读 · 3 评论 -
K-means聚类算法原理及c++实现
聚类是指根据数据本身的特征对数据进行分类,不需要人工标注,是无监督学习的一种。k-means算法是聚类算法中最简单的算法之一。k-means 算法将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。基于这样一个假设,我们再来导出k-means所要优...原创 2020-01-11 10:40:26 · 4339 阅读 · 3 评论 -
Fuzzy C-Means(模糊C均值聚类)算法原理及实现
模糊c-均值聚类算法 fuzzy c-means algorithm (FCMA)或称( FCM)。在众多模糊聚类算法中,模糊C-均值( FCM) 算法应用最广泛且较成功,它通过优化目标函数得到每个样本点对所有类中心的隶属度,从而决定样本点的类属以达到自动对样本数据进行分类的目的。模糊聚类分析作为无监督机器学习的主要技术之一,是用模糊理论对重要数据分析和建模的方法,建立了样本类属的不确定性描述...原创 2019-12-07 21:23:25 · 7670 阅读 · 1 评论 -
排序算法总结(二)——O(nlgn)时间复杂度排序
希尔排序我们前面讲的直接插入排序, 应该说,它的效率在某些时候是很高的,比如,我们的记录本身就是基本有序的,我们只需要少量的插入操作,就可以完成整个记录集的排序工作,此时直接插入很高效。还有就是记录数比较少时,直接插入的优势也比较明显。可问题在于,两个条件本身就过于苛刻,现实中记录少或者基本有序都属于特殊情况。有条件当然是好,条件不存在,我们创造条件也是可以去做的。于是科学家希尔研究出了一种排...原创 2019-11-27 20:53:44 · 3901 阅读 · 0 评论 -
排序算法总结(三)——非比较排序
计数排序计数排序的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数(此处并非比较各元素的大小,而是通过对元素值的计数和计数值的累加来确定)。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有17个元素的值小于x的值,则x可以直接存放在输出序列的第18个位置上。当然,如果有多个元素具有相同的值时,我们不能将这些元素放在输出序列...原创 2019-11-26 20:51:23 · 458 阅读 · 0 评论 -
排序算法总结(一)——O(n)时间复杂度排序
冒泡排序初级版冒泡排序冒泡排序(Bubble Sort) 一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。冒泡的实现在细节上可以有很多种变化,我们将分别就3种不同的冒泡实现代码,来讲解冒泡排序的思想。这里,我们就先来看看比较容易理解的一段。void bubble_sort0(int a[],int n) { for (int i = ...原创 2019-11-21 16:56:38 · 738 阅读 · 0 评论 -
六种c++计时器函数(秒级到微妙级)
以下所有代码都有使用Sleep()延时函数,需#include <Windows.h>1.使用clock(),ms级别计时器: double start = clock(); Sleep(1000); double end = clock(); double last = start - end; cout << last <<...原创 2019-11-20 16:02:02 · 12283 阅读 · 1 评论 -
常量指针(const pointer)和指向常量的指针(pointer to const)
这个叫法在博客上很有争议。有人说const pointer翻译是常量指针,但是英语难道一定是按顺序翻译么。举个例子const int类型的数据我们叫什么,整型常量没问题吧,不会说const在前面我们就叫常量整数吧。那const*不应该叫指针常量吗?还有比如指针数组,就是指针构成的数组,数组指针,就是指向数组的指针,那为什么指向常量的指针不能叫常量指针。指针常量Int *const p1...原创 2019-11-07 12:51:52 · 598 阅读 · 0 评论 -
二维数组与指针的关系详解
静态二维数组与指针我们定义一个二维数组int a[3][4]。二维数组实际是由多个一维数组组成,在这里,a[3][4]就是由3个长度为4的一维数组组成的二维数组。并且它们在空间上是连续的,相当于一个长为12的一维数组。数组类型说明a的类型为int(*)[4],数组指针(后面动态数组还会出现指针数组,注意区别),是指向第一个一维数组的指针,即a所指向的类型为一个一维数组。...原创 2019-11-04 15:57:51 · 6381 阅读 · 3 评论 -
链表基础知识总结
链表和数组作为算法中的两个基本数据结构,在程序设计过程中经常用到。尽管两种结构都可以用来存储一系列的数据,但又各有各的特点。数组的优势,在于可以方便的遍历查找需要的数据。在查询数组指定位置(如查询数组中的第4个数据)的操作中,只需要进行1次操作即可,时间复杂度为O(1)。但是,这种时间上的便利性,是因为数组在内存中占用了连续的空间,在进行类似的查找或者遍历时,本质是指针在内存中的定向偏移。然而...转载 2019-11-03 21:05:20 · 450 阅读 · 0 评论 -
动态规划详解
本文对原博客做了少量修改,包括个别错误的地方。代码改为了c++实现,原文使用的Java。1.动态规划介绍已知问题规模为n的前提A,求解一个未知解B。(我们用An表示“问题规模为n的已知条件”)此时,如果把问题规模降到0,即已知A0,可以得到A0->B.如果从A0添加一个元素,得到A1的变化过程。即A0->A1; 进而有A1->A2; A2->A3; …… ...转载 2019-11-01 19:04:01 · 387 阅读 · 0 评论 -
C++中使用函数模板出现“无法解析的外部符号”问题
在写程序中使用了函数模板 template<typename T> 之前运行过程没有什么问题,当我把函数放到另一个编译单元之后出现了“无法解析的外部符号”问题。原因就出在类模板上。首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.o...原创 2019-10-27 14:53:47 · 4648 阅读 · 0 评论 -
c++函数输入参数为数组时怎么求长度
如果你只想知道答案:静态数组,如果在函数里定义一个静态数组A,则在此函数里可以通过sizeof(A)/sizeof(A[0])求数组长度。如果数组A在函数外定义,并且作参数传入函数,怎么在函数里求其长度?——没法求,一般我们会再多传入一个参数记录长度动态数组,(1)用new创建的动态数组作参数时,在函数里同样也不能求长度,因此一般我们也会再多传入一个参数记录长度。(2)参数为vec...原创 2019-10-27 14:30:44 · 7642 阅读 · 4 评论