- 博客(34)
- 资源 (25)
- 收藏
- 关注
原创 c++模板实现归并排序
最近正在学习各种排序算法,今天实现了归并排序。先上代码:#include "stdafx.h"#include templatevoid Merge(T A[],const int& p,const int& q,const int& r) // p表示开始排序的位置,q是结束位置,r是断点{T *A_array_help = new
2012-11-28 09:42:03 486 1
原创 经典数据结构之最大堆
最大堆和最小堆是常用的优先队列。 其概念也比较简单,用树的方式描述,就是,父节点比子节点大(最大堆),小则为最小堆。最大堆和最小堆广泛用在有先后顺序的任务调度中。比如cpu的任务调度等。先上代码,后面再详细解释和补充我的看法。头文件#ifndef CBINARYTREE_H_INCLUDED#define CBINARYTREE_H_INCLUDED#include templ
2014-08-06 23:44:35 599
转载 高性能IO模式--Reactor和Proactor
在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作。 在比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步,同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指
2014-08-06 09:04:18 551
原创 经典数据结构之二叉树
二叉树是最为基本和最为重要的树结构,是堆的基础,也是学习树最为常见的入口。也是面试最常见的地方,虽然思路简单,却能在很短时间内考察到大家的功底。严格来说,树结构其实就是复杂的链接形式。.h文件/** *@ Program: the basic implement of BinaryTree; *@ Author: zhangyi; *@ Version: 1.0 *@ D
2013-12-29 00:02:28 506
原创 经典数据结构之:哈希(链接法)
哈希的链接法是最为常用的哈希方式,因为它易扩展,而且代码简单,基本就是将链表进行一定规则的操作。代码如下:#include "CLinearLink.h"templateclass CHashLink{private: // members; int m_nSize; CLinearLink* m_pLinks;public: // constructors; C
2013-12-24 22:44:41 1928
原创 经典数据结构之哈希(open address)
哈希表的意义在于保证一定存储规模的情况下实现快速寻址。这对于自然界的大部分数据是极有意义的。传统的哈希表碰撞的处理方式:开放地址法和链接法,本文是开放地址法。.h 文件#include #include template class CHashTable{private: // members; bool* m_pEmpty; E* m_pArray; si
2013-12-24 00:03:20 1304
原创 经典排序算法之bin排序
bin排序,顾名思义就是把对象放在盒子里进行排序,盒子本身已经代表了大小,所以,只要把对象放在对应的盒子,即可看做完成了排序,其排序时间复杂度为O(n)可以说是一种较为快捷的排序,然而,由于不是本地排序,所以空间复杂度较高。结合链表特性,将bin排序放在了链表里面如下:.h#include #include templateclass CLinearLink;templat
2013-12-04 23:28:51 1363
原创 经典数据结构之队列的链表实现方法
队列,其实就是先进先出,可以看做有特殊规定的数组或者链表,所以是适配器,并非一个全新的东西。具体代码如下:.h#include #include templateclass CLinkQueue;templatestruct SNode{ friend class CLinkQueue;private: SNode* m_pNext; T m_nData;publi
2013-12-01 22:18:56 620
原创 经典数据结构之数组实现的队列
队列和栈是最为基础的也是最为重要的数据结构。它采用先进先出的方式,广泛应用于网络编程中,套接字接受队列,消息队列,以及操作系统的优先队列中。归根到底,它和栈的区别就是每个元素的权重问题,所以可以统一看作一种具有优先级的线性表适配器。本文实现了基于数组的队列,其主要操作是添加和删除元素。为了实现O(1)添加O(1)删除元素,就需要移动队头坐标。.h#ifndef CQUEUE
2013-11-28 23:54:54 711
原创 经典数据结构之链表实现的栈
数组和链表是线性表的两种表现方式,而栈作为一种适配器,既可以用数组实现,也可以用链表实现,由于采用后进先出的方式,两者添加和删除元素都是O(1)的。主要区别之处是数组本身使用的空间较小,因为只需要用n个元素外加长度属性就好了。链表使用的空间较大,这是因为节点本身需要一个指针和数据来表示。#include #include templatestruct CLinkStack;temp
2013-11-27 23:50:52 548
原创 经典数据结构之稀疏矩阵
数据的存储形式,不外乎链表和类数组两种。使用二维数组存储矩阵,如果该矩阵是稀疏的,那么会浪费很多空间。例如一个4*4的对角阵,很明显,只有主对角线上才有元素。那么使用二维数组存储需要16个单位的 存储空间。然而通过定义一个结构体:templatestruct SDataType{ friend class CSparseMatrix; int m_nRow; int
2013-11-26 23:44:32 780
原创 经典数据结构之矩阵的基本运算
用一维数组来表示矩阵其实质与二维数组没啥区别,只是多了下标一步映射而已。由于方法本身很简单,所以不多做介绍。很容易扩展转置等方法,从而实现一个更为全面的矩阵类型。CMatrix.h#ifndef CMATRIX_HHH#define CMATRIX_HHH#include #include #include templateclass CMatrix{private: /
2013-11-24 21:05:00 1986
原创 经典数据结构之二维矩阵的基本运算
数组的数组即是矩阵,这篇文章就是很好的例子。往往我们会抱怨c++ std里面没有现成的矩阵运算库,其实,矩阵运算十分容易构造,不论是二维数组,还是经过打包的数组,甚至是vector等容易,都可以很轻易地做出扩展,满足我们复杂的要求。具体代码如下所述:.h文件#ifndef CARRAY2D_HHH#define CARRAY2D_HHH#include #include
2013-11-21 23:26:19 1912
原创 经典数据结构之一维矩阵的基本操作
矩阵是用来进行大型数据处理的常用数据表达形式。最基本的矩阵自然是一维矩阵,而从概念上,数组可以看作一个一维矩阵。另一方面,数组的数组即是二维矩阵。其实,通过下标映射,一维矩阵可以表达所有维度的矩阵。下面先由一维矩阵说起。.h文件#include #include #include templateclass CArray1D{private: // members; int
2013-11-18 23:39:10 3288
原创 经典数据结构之内存池技术
一般来说,使用堆来动态分配内存是常用的方式。然而,如果不断申请堆,会造成内存碎片,以至于由于堆本身大小的限制,难以再申请出连续空间的堆,显然造成了内存利用不合理。所以,有必要对内存申请进行一些管理。对于大型程序来说,很必要,提前申请一定量的堆,一定比不断申请快很多。使用数组方式,可以很快检索到可用的空间,并O(1)进行存取,而节点做成链表结构,更可以在O(1)释放某个空间之后找到合适的节点进行分配
2013-11-12 10:00:46 1025
原创 经典数据结构之间接寻址
线性表主要有两中表现方式,一种是连续存储式,例如数组,另一种是非连续存储式,例如链表。 相比于链表,数组最大的好处就在于可以随机存取,链表的最大优势是,能够有效利用存储空间,合理的添加,删除操作只需要o(1)。于是诞生了间接寻址,即是把数组与链表的优点结合起来。代码如下:#ifndef INDIRECTLIST_HH#define INDIRECTLIST_HH#include
2013-11-11 19:21:18 1013
原创 经典数据结构--双向链表
双向链表是数据存储的一种表达方式。相比单链表本身,双向链表有一个很重要的优势就是,可以回头,然而也因此需要付出多个指针的存储空间代价。代码如下所示:#ifndef DOUBLELIST_HHH#define DOUBLELIST_HHH#include templateclass CDoubleList;templatestruct SDNode{private
2013-11-06 23:29:23 482
原创 经典数据结构与算法之循环单链表
循环链表是链表的经典变种,它可以解决很多问题。比如有个考察大数据的问题,假如有10亿个数据,如何选出其中最大的十个数。显然,我们可以构造一个循环链表,然后依次插入这10亿个数,与之前最大的数进行比较,如果大则插入,否则跳过。思路很简单,循环链表唯一的不同之处是,尾节点的next指针指向头结点。具体地说代码如下:#ifndef CIRCULARLINK_HHH#define CIR
2013-11-04 22:46:24 580
原创 泊松随机数产生
随机数是计算机模拟仿真领域里面最常见的。随机数发生器,广泛应用于系统分析,例如网络中请求量到达,以及其他排队原理中。代码如下,远离后续再补充:#ifndef POSSION_HHH#define POSSION_HHH#include #include #include #include using namespace std;#define DEBUGvoid See
2013-11-04 13:26:30 1848
原创 经典数据结构--简单链表
链表作为最为常见的数据结构,它不需要连续的存储空间,插入和删除操作可以做到o(1)。可以说是链式数据结构的基础,树,图等其实都是复杂链表。针对专门的问题,例如跳表,循环队列等,都是各个面试常遇到的问题。具体代码如下所述,主要实现了关键部分,未考虑异常(无法申请空间等)情况。#ifndef CLINEARLINK_HHH#define CLINEARLINK_HHHtemplatec
2013-11-02 22:12:26 558
原创 典型数据结构:线性表(基于数组的实现)
templateclass CLinearList{private: // data; T* m_pData; int m_nLength; int m_nSize;public: // constructors; CLinearList(void); CLinearList(int size); ~CLinearList(void); // methods; bool
2013-10-31 11:48:44 531
原创 二维微分方程组 龙格库塔 数值解
#include #include "Possion.h"#include using namespace std;float *function1(float,float,float);float *function2(float,float,float);void RungeKutta_2D(const float& t_init,const float& t_interv
2013-10-28 21:13:11 6113 1
原创 su与sudo使用详解
su与sudo这两个命令几乎是linux里面最常用的,然而这两个命令却并不简单,su - 与 su是最为容易混淆的两个命令。加上'-'是为了切换环境变量,这是在用户登陆时切换为该用户默认的环境变量。例如:su - root 等价于 su - 意味着登陆后会加载root用户的环境变量。 最常用的环境变量莫过于登陆后系统会将所处目录设为~/home/username[linux@
2013-10-15 10:59:39 840
原创 典型数据结构--基于链表的队列实现
#include using namespace std;templatestruct Node{T m_nData;Node* m_pNext;Node(T data);};templateNode::Node(T data):m_nData(data),m_pNext(NULL) {}templateclass C
2013-10-10 14:17:07 533
原创 经典数据结构--数组实现的栈
templateclass CStack{private: T* data; int length; int size;public: CStack(); ~CStack(); void Create(); bool IsEmpty() const; bool IsFull() const; T Top() const; void A
2013-10-09 17:39:37 677
原创 matlab 使数据具有统计意义
大家都会遇到这个问题。取到的数据量很大,想看看数据的分布,奈何画出图来总是由于噪声,导致层次不齐,反而淹没了规律。比较简单的方式就是取平均,平均值相比而言更具有统计意义,只要实例够多,就可以当作一种无偏估计。所以抽空做了桶划分的函数。具体做了两种,一种是桶大小一样的,一种是指数的。 平均方法如下:function aimlist = AvgBucket(arg_list,arg_buc
2013-09-17 16:58:51 776
原创 c++实现字符串分割
类似于python,shell,perl等语言都提供了方便的split()接口,用以分割字符串。c++/c需要自己写,这样耗时耗力还没效率,没保障的方法,当然是需要避免的。又是强大的boost库提供了方便。.h文件#ifndef DIRFILEOPT_HHHH#define DIRFILEOPT_HHHH#include #include #include using s
2013-09-13 19:47:27 1081
原创 c++ 利用boost 实现文件操作
对文件夹里面的文件进行遍历操作是基本技能之一,python,perl以及bash等脚本都很好的实现了文件遍历方法,对于c/c++来说,只能通过系统自定的api获取。虽然文件夹操作本身是调用操作系统内核的接口,但毕竟接口不够友好。 boost不愧是准标准库,filesystem提供了极为简便的方法,如下所示:// filesystem tut3.cpp ---------
2013-09-13 19:35:21 8719
原创 固定长度数组
实际应用中,有很多用到定长数组的时候,下面结合模板类给出一个定长数组的实现方式。#ifndef __FIXED_ARRAY_H#define __FIXED_ARRAY_H#include template class CFixedArray{public: CFixedArray(); CFixedArray(const CFixedArray &right)
2013-09-09 18:30:32 1149
原创 c++文件操作实现提取字段功能
最近做一些数据方面的挖掘,发现python或perl的split函数功能,c++没有。在linux下awk很容易提取出来,但是对于偏爱vs的我来说,写一个可以提取字段的split还是很有用的,纯粹用于数据清洗。多做几个函数,以后归并为类,做成库,就方便了,总是造轮子,是没有头的。#ifndef EXTRACT_DATA_HH#define EXTRACT_DATA_HH#include
2013-01-10 23:41:38 1182
原创 python遍历目录,读写文件
文件遍历是数据处理中最为基本的一部分。我们使用python的os模块,os里面有个walk函数可以以列表形式返回文件夹的父文件夹,里面所含文件夹以及它所含的文件。从而可以实现数据的遍历读取。#! /bin/pythonimport osimport sysimport os.pathdirroot = "G:\\data_to_resolve\\"line_num =
2012-12-11 15:30:49 2859
原创 冒泡排序
冒泡排序是在数据结构与算法中最为简单的一个排序方法,属于交换排序的范畴,当然也是原地排序。其机理是逐次比较,把最大的值冒出来,放在数组最后一个位置。同理,从头开始,将次大值冒出来放在数组倒数第二个位置,直到排序完成。显然两层循环嵌套,其最坏的情况是O(n-1)+O(n-2)+...+O(1),结果为O(n * n),在排序算法中属于效率较低的一类。templatevoid Bubble
2012-11-29 08:31:52 450
原创 c++实现插入排序模版
简单说一下,插入排序的原理:就像从小到大插入扑克牌一样,插入新牌之前,插入的牌序已经是从小到大排列好。所以,第一张牌即是i = 0 的那张,就应该从 i = 1开始插入。j是后来要插入的位置。具体说来,程序流程如下:具体说来:#include using std::cout;using std::endl;#ifndef Insert_Sort_HHH#define Ins
2012-11-28 23:15:56 502
Deeplearning with graph structured representations.pdf
2020-05-13
Vector field processing
2018-12-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人