自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 qt5下中文乱码的解决

qt4已经是过去式了,不提。qt5下,不论是用的gcc,msvc还是mingw,都将编码格式保存为带BOM的utf-8格式,然后在需要中文字符串的地方用QStringLiteral宏修饰,可以一劳永逸解决99%的问题。在qtcreator中设置编码格式为,工具-选项-文本编辑器-行为,右侧可以看到。

2018-01-22 17:43:50 452

原创 qt报错意外标记的class

今天特别诡异,写了一个很简单的类,然后就一直报这个错误。大家都知道一般报这个错误是无法定位到真正出错的地方的。会定位到一些内置头文件里。还好一般这个不是什么大的bug,网上出现的一般是头文件的重复包含啦,未声明就使用类啦等等。我这里遇到的是定义完类(头文件中)没有在末尾加分号!感谢点击打开链接博主提供的帮助。我的编译器是msvc,不太清楚mingw版本的是不是能比较智能的定义到真正的出错地方。

2018-01-22 16:56:04 1489

原创 Dijkstra求单源最短路径

思路:Dijkstra求解带权有向图的单源最短路径问题。与Bellman-Ford算法的区别是要求图中没有负的权值边。在这种情况下Dijkstra算法通常有比较好的复杂度。特别是使用堆以后。算法维护一个点集S,该集合中的结点的最短路径已经求出,算法重复从结点集V-S中选择最短路径估计最小的结点,将其加入S中,并该结点出发的所有边进行松弛。代码:// dijkstra.cpp : 定义控制台

2018-01-09 22:16:59 396

原创 求二叉树最高叶子节点的深度

思路:leetcode的一道题。递归求解,依次求每个结点的最高叶子结点的高度。也可以改成非递归形降低时间复杂度。代码// leetcode111.cpp : 定义控制台应用程序的入口点。// AC// 求二叉树最高叶子节点的深度// 递归求解#include "stdafx.h"#include #include using std::cin;using std::co

2018-01-09 11:35:09 728

原创 判断有向图是否有环

思路:leetcode的一道题。无环的有向图可以排出一个拓扑顺序。首先将每个结点的入度求出(扫描一遍边表),如果没有入度为0的结点,则说明有环。在循环开始前,入度为0的结点表示其没有先修课程,可以看作是已排好拓扑序。循环中,每次选择一个结点,扫描其邻居结点并检查入度,如果某个邻居结点的入度为1(说明只和当前结点相邻),则将其加入拓扑序中,依次循环。对结点的搜索可以是BFS。代码://

2018-01-09 10:03:24 2219

原创 并查集求集合个数和每个集合中的元素个数

思路:维护一个数组,代表以某个结点为根的树的结点数目,初始化为全1。在合并两个集合时,将秩较小的集合的元素数目加到秩较大的集合上。这里需要注意一下,就是Union过程处理两个祖先相同的结点,此时实际上没有真正的合并这两个结点,所以不需要更新集合的元素数目。至于统计集合个数就比较简单了,直接扫描一遍所有的结点,如果某个结点的祖先结点不是它自己,说明该结点是某个集合的祖先元素,统计这种结点个数即可。

2018-01-06 22:24:50 9742 1

原创 并查集

思路:并查集用于解决两个问题。1:判断两个元素是否属于同一集合。2.将已有的两个集合进行合并。常用并查集实现的问题有最近公共祖先(LCA)问题和kruskal求最小生成树。在进行两个集合合并的时候,可以采用一种启发式的按秩合并策略。代码:// 1346.cpp : 定义控制台应用程序的入口点。// 并查集// 带路径压缩#include "stdafx.h"#include

2018-01-06 17:28:56 130

原创 poj4001

思路:裸的BFS。每一步有三种状态:左走一步,右走一步和向右走到翻倍的距离处。需要注意的就是不要走出题目规定的数据范围。代码:// 1253.cpp : 定义控制台应用程序的入口点。// BFS// 共三种状态,左走一步,右走一步和向右走到翻倍的距离处// 注意能走到的最左边和最右边的范围#include "stdafx.h"#include #include #defi

2018-01-04 21:23:32 223

原创 迷宫问题

思路:裸的BFS。每次在四个方向上进行搜索,如果走得通(没有碰到边界或障碍),就将该结点加入队列。该结点的最短路径长度更新为其前驱结点的最短路径长度+1,如果需要重构路径的话,数组中保存该结点的前驱位置,输出的时候倒序输出(利用一个栈)即可。代码:// 1252.cpp : 定义控制台应用程序的入口点。// AC// BFS求迷宫问题,从左上角走到右下角#include "stda

2018-01-04 21:20:03 348

原创 BFS求四连通块数目

裸BFS的题目。输入是一个n*m的矩阵,矩阵由0-9的数字构成,0表示海水,数字表示陆地,求四连通的陆地块的数目。今天发现,BFS在遍历到某个结点时,先访问该结点再将邻接点入队和先将邻结点入队再访问该结点没有本质区别。而DFS则需要在某个结点可以深入的结点全部访问完再回溯到该结点时,再对其进行访问。代码:// 1329.cpp : 定义控制台应用程序的入口点。// AC// B

2018-01-04 16:48:39 1895 2

原创 二叉树的遍历

二叉树的遍历分为递归和非递归。渐进的时间复杂度都是O(n),非递归算法由于没有函数递归调用的开销,有比较好的空间复杂度。代码是根据邓俊辉老师的书来写的。代码://traverse a binary tree in recursive or non recursive way#include #include #include #include #include using

2018-01-03 11:07:14 419

原创 单链表反转

参考了网上的资料。思路1:利用两个指针分别指向相邻的结点,再利用一个指针指向链表剩余的结点。改变这两个指针的指向,然后依次迭代。初始化:p和q分别指向两个相邻结点p=L.headq=L.head->next第一步:摘除头结点p->next=nullptr;第二步:进入循环r=q->next   //指向链表剩余结点q->next=p //将指针指向反向p=q

2018-01-03 10:28:20 199

原创 链表实现队列

思路:队列涉及到两端的操作,所以使用头结点和尾结点两个指针,避免在入队操作时遍历整个链表。代码:// linkedlistqueue.cpp : 定义控制台应用程序的入口点。// 链表实现队列#include "stdafx.h"#include using std::cin;using std::cout;using std::endl;using std::cerr;

2018-01-02 22:23:37 176

原创 链表实现栈

思路:链表实现栈比较自然,而且这里使用了双链表,单链表也够用。链表实现的栈个人感觉就是灵活性强一点,复杂度方面不如数组实现。代码:// linkedliststack.cpp : 定义控制台应用程序的入口点。// 链表实现栈#include "stdafx.h"#include using std::cin;using std::cout;using std::endl;

2018-01-02 22:19:23 183

原创 两个队列实现一个栈

来自CLRS习题。思路:第一次有元素入栈时,两个队列都为空,假设该元素进入队列q1。当需要元素出栈时,将不为空的队列中除去最后一个元素“搬”到另一个为空的队列,然后将第一个队列中剩余的一个元素出队就完成出队操作。此后若入栈,则选择一个不为空的队列入队;若出队,则重复上面的操作。用队列实现栈时比用栈实现队列要略微麻烦一些,因为虽然每次入栈是O(1)的操作,而每次出栈都需要将n-1个元素搬至另外一

2018-01-02 22:05:56 208

原创 两个栈实现一个队列

来自CLRS习题。思路:设有两个栈s1和s2。当有元素入队列时,执行s1的进栈操作;当需要元素出队列时,将s1中的元素全部出栈并依次进入s2中,此时s2的栈顶为所需元素,出栈即可,s1变为空栈。假设此后需要出队列操作,直接将s2中的元素出栈即可,如果s2中没有元素,则重复之前的操作(形象的说就是将s1中的元素全部“倒”进s2中)。依次循环即可。代码(操作1表示有一个元素入队,操作2表示出队

2018-01-02 21:56:53 246

原创 一个数组实现两个栈

思路:两个栈栈底分别为数组两端,栈顶分别向数组中间发展。长度为N的数组在两个栈的元素总数不超过N时不溢出。代码如下:// twostacks.cpp : 定义控制台应用程序的入口点。// 一个数组实现两个栈,从两边开始分别增长// 最多可容纳n个元素#include "stdafx.h"#include #include #define N 10int a[N];int

2018-01-02 21:55:56 599

原创 qt5编译boost

首先声明环境:win7_64+qt5.7+msvc2015_64。Linux环境下没这么麻烦。boost是啥就不多说了,可以理解为加强版的STL。官网下载对应版本的boost,解压缩到文件夹,文件夹的名字应该是boost_1_xx_x的形式。1.打开qt的命令行界面(就是对应编译器的for desktop那个bash,比如我这里的Qt 5.7  64-bit for Desktop M

2017-10-09 17:42:18 736 3

原创 qt5配置sp++

首先强调环境是qt5.7+sp++3.0。想用c++写一点信号处理的东西,网上搜了一下看到了我国有人开发的c++信号处理库sp++,准备折腾一下弄到之前的qt项目中。sp++实现了向量,矩阵,线性方程等数值运算,以及包括fft,滤波,时频等信号处理功能。后面会有原来项目的链接,有详细介绍。下面简单说一下qt5中sp++的配置。sp++的作者说由于用了模板类,分离编译比较麻烦,所有把

2017-10-08 15:18:44 2602

原创 求序列的最大最小值

单求最大或最小值需要遍历整个序列,复杂度O(n)。当同时求最大和最小值时,可以将序列的每一对相邻元素先做比较,然后与当前的最大值最小值进行比较,来决定是否更新。这样每两个元素之间需要3次比较。代码如下:// maxmin.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include #include

2017-10-06 22:14:18 3271

原创 Golang中的panic和recover

func panic(interface{})和func recover() interface{}是Golang中用于错误处理的两个函数。panic的作用就是抛出一条错误信息,从它的参数类型可以看到它可以抛出任意类型的错误信息。在函数执行过程中的某处调用了panic,则立即抛出一个错误信息,同时函数的正常执行流程终止,但是该函数中panic之前定义的defer语句将被依次执行。之后该goro

2017-09-25 10:27:24 7354

原创 高精度乘法(正整数)

高精度正整数乘法,包含了高精度正整数的加法。就是最简单的字符串处理,注意一些细节就行。代码如下:// 1036.cpp : 定义控制台应用程序的入口点。// 大整数乘法#include "stdafx.h"#include #include #include #include using namespace std;//大整数加法string add(string s1

2017-08-28 22:54:53 697

原创 桶排序的简单实现

桶排序的思想有点像计数排序,又有点像快速排序,还用到一点hash的东西,值得仔细琢磨。具体做法如下,按照某种hash函数,将数据映射到不同的桶中,使用hash是因为我们要保证每个数据的映射过程应该在常数时间内完成。映射完成后,每个桶中的数据相比于其他桶都是有序的(也就是相邻的桶有严格的顺序),这个就有点像快速排序了(可以把那里看成是两个桶)。之后可以对每个桶内的数据用其他的排序方法排序。当然也

2017-08-24 21:18:10 500

原创 计数排序的简单实现

计数排序的原理比较简单,但是很巧妙。有点类似于桶排序,但是有一些区别。具体思想是,给定一个数组,先统计各个元素出现的次数,用元素的值做下标,得到一个新的数组。然后扫描这个数组,对于数组的每个下标,如果它对应的值不为零,说明原来数组中就有几个这样的值。由于下标的天然递增,依次将这些值展开就得到了排序后的数组。但是计数排序有它的局限性,首先如果想用数组统计各个元素出现的次数,它的值必须是正整数

2017-08-24 17:23:02 1446 1

原创 归并排序的简单实现

学习递归最开始就是斐波那契和归并排序。核心思想就是递归地把序列分成两部分,直到只剩一个元素。然后将每次划分的两部分再递归地合并起来,合并时候的顺序觉决定了排序的顺序还是逆序。划分的过程可以看做是生成一颗叶子结点数为n的二叉树,这个过程的复杂度为lgn(树的高度)。而合并的过程是相当于将每层的节点数相加,复杂度为n*lgn。所以整体的复杂度为O(nlgn)。CLRS里给的复杂度分析方法是递归树(

2017-08-23 15:51:09 307

原创 Go语言自定义错误类型

Go里面的接口属于比较难理解的概念,通过它独特的错误处理方式可以帮助学习接口。Go的错误类型使用error类型,它其实就是一个实现了Error()函数的接口:type error interface { Error() string}所以再自定义一个错误类型,只需要实现其中的Error()函数即可。以官网给的练习为例:package mainimport ( "

2017-08-15 17:39:26 3087

原创 hdoj1071

给定二次曲线上三个点,求这三个点和曲线构成部分的面积。可能我的想法比较麻烦,因为交完1500多B,然后看榜前面都是200多B。思路:根据克莱默法则求出二次曲线系数a,b,c,然后求一个积分值。注意一点就是c++中控制格式输出是头文件。然后设置位数是setw(),设置小数点位数是setprecision()。代码如下:// hdu1071.cpp : 定义控制台应用程序的入口点。// Ac

2017-08-15 10:44:40 228

原创 hdoj1076

判断闰年。数据量比较小,打表都不需要了。代码如下:// hdu1076.cpp : 定义控制台应用程序的入口点。// Accepted#include "stdafx.h"#include #include #include using namespace std;bool check_leap_year(int year){ if (year % 100 == 0)

2017-08-14 22:34:48 184

原创 hdoj1086

判断一堆线段的交点个数。利用叉积。代码如下。// hdu1086.cpp : 定义控制台应用程序的入口点。// Accepted#include "stdafx.h"#include #include #include #include using namespace std;class Point { friend bool check_cross(const Poi

2017-08-14 22:20:08 219

原创 hdoj1088

输入一串以空格,制表或换行分隔的文本。将其中的作为换行输出,作为水平标尺输出,其余单词以空格分开原样输出,每行不超过80个字符。代码如下// hdu1088.cpp : 定义控制台应用程序的入口点。// Accepted#include "stdafx.h"#include #include #include #include #include #include us

2017-08-14 21:26:49 228

原创 Exercise: Maps

Go官网关于map的一个练习。分割一个句子,统计每个单词出现的次数。package mainimport ("golang.org/x/tour/wc""strings")func WordCount(s string) map[string]int {temp:=strings.Split(s," ")m:=make(map[string]int)

2017-08-13 22:17:33 229

原创 IP地址判断

输入一个字符串,判断是否是合法的IP地址。具体的做法是用'.'将字符串进行分割,分割后如果满足:1.有4部分 2.每部分是0-255的整数 则为合法的字符串。但是由于c++里没有python中的split(貌似boost里有),所以要自己写一个split函数。这里借鉴了别人的写法(一开始我想暴力判断,后来发现行不通,还是要用分割来做)。代码如下// 5.cpp : 定义控制台应用程

2017-07-18 11:22:15 403

原创 二路插入排序

插入排序时需要移动大量元素。为此可用一个辅助的循环数组来减少元素的移动次数。具体做法如下,对于一个待排序的数组a,我们首先找到一个与a相同大小的循环数组。然后按照以下操作进行。1.令b[0]=a[0]。因为一个元素总是有序的。2.令两个指针first和final指向b中已存在元素的最大和最小值。3.对于从a[1]开始的元素,我们从b中寻找其正确的插入位置。这时会出现三种情况。如果a[i

2017-06-12 17:14:19 455

原创 括号匹配

栈的一个简单应用,检查字符串中的括号是否匹配。具体思路是扫描每个字符,遇到(,[,{则入栈,遇到),],}则检查栈顶元素,如果栈顶元素不是与之匹配的(或[或{则证明不匹配,可以设置标志位并提前退出。全部扫描完成后如果标志位被置位或者栈不为空,说明该表达式不匹配。代码如下:// bracketmatch.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"

2017-06-12 11:54:21 268

原创 单链表操作

单链表操作的实现,包括初始化,插入,删除,遍历,排序,归并等。为了方便,使用了带头结点的单链表。注意,单链表的局限之处在于只能向后继方向进行遍历,所以在进行插入和删除操作时要找到目标结点的前驱结点。这个比较关键。其他的细节就比较简单了。代码如下:// LinkList.cpp : 定义控制台应用程序的入口点。//带头结点的单链表#include "stdafx.h" #inclu

2017-06-12 10:31:12 219

原创 顺序表操作

顺序表的简单实现。包括表的初始化,插入,删除,归并。内存分配使用C语言的malloc和realloc来实现。假设在每个合法位置进行插入和删除操作的概率相等,则这两种操作每次的平均移动次数为n/2,时间复杂度为O(n)。代码如下:#include #include #include using namespace std;#define LISTINCREMENT 10

2017-06-11 10:58:35 449

原创 c++STL总结

IO条件状态:iostate 机器相关类型,提供了表达条件状态的完整功能。badbit 指出流已崩溃。failbit 指出IO操作失败。eofbit 指出流达到文件结束。goodbit 指出流未处于错误状态。为0表示正确。上面几个状态为对应的返回函数为s.bad(),s.fail(),s.eof(),s.good()。此外还有:s.clear()用于将流s中所有条件

2017-05-19 20:04:29 243

原创 c++中的访问说明符

之前一直知道protected是介于private和public两种访问权限的中间者,影响友元和派生类的访问权限。但是对于具体的细节还有一些疑惑的地方,今天仔细研究了一下c++primer上关于这一部分的解释,简单做个总结如下。首先我们只考虑派生列表中使用的访问说明符,即所谓的派生访问说明符。对于基类B中的不管是public,private还是protected成员,我们有以下的原则。1.

2017-05-19 14:55:07 2663

原创 mne-python学习之二 基本数据处理

events=mne.find_events(raw) #找到所有mark标记,返回一个list这里返回了我们所采集的erp数据(eeg)中的mark数组。其中的events是一个2维的numpy数组,第一列是对应mark出现的时间,最后一列是不同mark的标号。我们把其中出现的前五个mark的信息输出看一下。从上面可以看出不同刺激出现的时间以及其标号,也可以看到我们返回的ev

2017-05-15 19:36:16 6668 2

原创 mne-python学习之一 入门介绍

mne-python是一款开源的EEG/EMG分析、处理和显式的软件。遵循LGPL协议,由Harvard大学牵头,社区共同开发。主要功能包括:EEG/MEG信号的预处理和去噪,源估计,时频分析,统计测试,功能性连接,机器学习,传感器和源的可视化等等。mne支持了大部分常见的原始数据格式,默认的(以及自带的sample data)采用的是一种.fif格式,但同时它也支持如.vhdr,.edf,.

2017-05-10 21:22:23 19698 10

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除