数据结构
一缕阳光a
(1)、从2018年8月开始从事分布式数据库内核开发工作,包括自研分布式分析型数据库OLAP、自研分布式数据库HTAP,根据开源数据库实现本公司集群型的OLTP产品,以及现在正在做的根据opengaussDB开发的HTAP类型数据库。
(2)、乐于专研,对分布式数据库有强烈的兴趣。
个人邮箱: zgaoq@163.com。
展开
-
在X32与X64下,每种数据类型占用的字节数
在X32与X64下,每种数据类型占用的字节数分别如下: X32 X64指针 4Byte 8Bytechar 1Byte ...原创 2021-12-25 10:34:18 · 1000 阅读 · 0 评论 -
编译rocksdb源码导致的部署失败
这几天经历了一次心酸的历程,使用了rocksdb第三方库,编译器是7.2,rocksdb是20190701从github上取下来的,由于rocksdb自己的CMakeList.txt中使用了-march=native编译参数,强制使用了编译代码服务器的cpu指令集,由于是一个集群,集群中的服务器cpu型号信息不一定都一致,导致集群中部分服务器起不来。引起了大领导的关注,自己一下子提起了精神事情...原创 2019-10-12 18:11:41 · 793 阅读 · 0 评论 -
用O(1)的时间复杂度删除单链表中的某个节点
用O(1)的时间复杂度删除单链表中的某个节点给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode* pListHead, L转载 2017-02-13 16:26:55 · 811 阅读 · 0 评论 -
两路归并排序
两路归并排序(升序排列) (平均/最差)时间复杂度O(NlogN)将两个有序的单链表合并为一个有序的单链表,默认是按升序排列的。合并操作是非常适合用递归来完成的一类操作,递归实现将会比迭代实现更加清晰且易于理解。尽管如此,你可能也不愿意使用递归来实现这个操作,因为递归方法所使用的栈空间与链表的长度成正比。部分关键代码如下:typedef struct _Node_t原创 2017-01-25 23:06:48 · 2781 阅读 · 0 评论 -
二分法查找
二分法查找:java代码如下public class Bisearch { public static int bisearch(int[] data, int find){ int low = 0; int mid = 0; int upper = 0; if (null == data) {原创 2017-02-14 14:29:14 · 278 阅读 · 0 评论 -
求字符串全排列的递归算法
求字符串全排列的递归算法void permutation(char * p_str, char * p_begin) { if(!p_str || !p_begin) { return; } if('\0' == *p_begin) { printf("%s\n", p_str);原创 2017-03-20 13:56:00 · 539 阅读 · 0 评论 -
双向循环链表的插入与删除
关于解释部分不再多说了,网上资料很多,下面就介绍具体的实现吧//双向循环链表的插入与删除typedef struct node{ int data; struct node *prev, *next;}DNode, *DLinkList;//在带有头结点双向循环链表中第1个数据域内容为x的结点右边插入一个数据信息为item的新结点void i原创 2017-03-30 19:23:35 · 5550 阅读 · 0 评论 -
一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针
输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针typedef struct _node_t{ struct _list_t *next; int data;}Node;Node *list_k_node(Node * head, int k) { Node *p=head, *pk=head; if (NULL ==原创 2017-01-17 19:32:53 · 687 阅读 · 0 评论 -
二叉树前序、中序、后序遍历非递归写法的透彻解析
前言在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最简单,后序遍历最难。我们的讨论基础是这样的: [cpp] view plain copy//Binary Tree Node typedef struct node { int dat转载 2018-01-17 20:49:28 · 24880 阅读 · 7 评论 -
红黑树相关的信息
转载:https://www.cnblogs.com/wuchanming/p/4444961.html 红黑树相关的知识点,提高自己和面试应该用的到1.stl中的set底层用的什么数据结构?2.红黑树的数据结构怎么定义的?3.红黑树有哪些性质?4.红黑树的各种操作的时间复杂度是多少?5.红黑树相比于BST和AVL树有什么优点?6.红黑树相对于哈希表,在选择使用的时...转载 2019-04-04 18:34:37 · 130 阅读 · 0 评论 -
函数局部变量和函数的参数在栈中的布局
#include <stdio.h>#include <iostream>using namespace std;void func(int p1, int p2, int p3){ int a = p1; int b = p2; int c = p3; std::cout << "函数参数入栈顺序(栈在内存中向上...原创 2019-04-14 16:49:22 · 2433 阅读 · 1 评论 -
LSM树存储模型
LSM(log-structed-merge-tree)leveldb和rocksdb底层使用LSM树做存储引擎,LSM树使用skiplist做索引,他们先将数据写入内存中,按照key进行划分,定期的merge写入到磁盘中,合并后数据写入下一层levelLSM是什么?解决什么问题?在leveldb和rocksdb中,面临的一个主要问题是数据的落盘,在写磁盘时,随机写会消耗很大的磁盘IO,...原创 2019-06-11 16:37:00 · 586 阅读 · 0 评论 -
面试时写不出排序算法?看这篇就够了
转载:https://mp.weixin.qq.com/s/dyRTXwsmUmFcF9PeFR8OrQ本文主要详细讲述常见的八种排序算法的思想、实现以及复杂度。冒泡排序要点冒泡排序是一种交换排序。什么是交换排序呢?交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。算法思想它重复地走访过要排序的数列,一次比较两个元素,...转载 2019-08-18 16:01:50 · 191 阅读 · 0 评论 -
hash()函数的实现
输入参数都是字符串。6种hash函数的实现以及使用方式:template<class T>size_t BKDRHash(const T * str) // 该效率最高{ register size_t hash = 0; while (size_t ch = (size_t)*str++) { hash = hash * 131 ...原创 2019-09-05 12:12:34 · 1499 阅读 · 0 评论 -
从文件中读取数据,排序之后输出到另一个文件中
文件中有一组数据,要求排序后输出到另一个文件中去主要有两个知识点: 排序、文件操作C++/C代码如下:[cpp] view plain copy#include #include #include using namespace std; void Order(vectorint> &data)//原创 2017-02-12 00:04:52 · 6953 阅读 · 0 评论 -
删除list中的一个节点
删除list中的一个节点typedef struct _list_t { struct _list_t *next; int data; }list; void delete_node(list *head, int i){ list *p = head, *q = NULL; int j = 0; if ((NULL =原创 2017-01-16 23:29:46 · 1723 阅读 · 0 评论 -
C语言面试题大汇总之华为面试题
该面试题大全可以很好地提高C++/C程序员的技术综合实力1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那转载 2017-02-11 16:55:24 · 4797 阅读 · 0 评论 -
在一个list中增加一个节点
在一个list中增加一个节点typedef struct _list_t{ struct _list_t *next; int data;}list;void insert_node(list *head, int i, char x){ list *p = head, *q = NULL; int j = 0; if ((NULL ==原创 2017-01-16 23:26:05 · 1118 阅读 · 0 评论 -
判断一个单链表中是否存在环
#判断一个单链表中是否存在 环。#设置两个指针(fast, slow),初始值都指向头,slow每次前进1步,fast每次前进2步,大概的思路如下:如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。如果链表不存在环,则fast必定先指向NULL,而slow后指向NULL。如果存在环,则返回1; 否则,返回0int IsExit原创 2017-01-17 18:46:38 · 2752 阅读 · 0 评论 -
判断一个链表是否为循环单链表
判断一个链表是否为循环单链表:#设置两个指针(fast, slow),slow步长为1,fast步长为2,大概的思路如下:如果链表为循环单链表,则fast与slow必定相遇。如果链表不为循环单链表,则fast必定先指向NULL。int IsLoopList(list *head){ list *s = head->next; //慢指针原创 2017-01-17 18:48:33 · 1951 阅读 · 0 评论 -
排序算法之希尔排序(C/C++)
从第一个数开始,判断第一个数和n/2那个数的大小,如果v[0]大于v[n/2]就交换,1与3比较,2与4比较,3与5比较...............void shell_sort(char *str, int len){ int group = 0, i = 0, j = 0, temp = 0; if ((NULL == str) || (0 >= len))原创 2017-01-17 20:11:41 · 302 阅读 · 0 评论 -
排序算法之选择法排序(C/C++)
简单选择排序的基本思想:第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕void select_sort(int a[], int n){ int i =原创 2017-01-17 20:19:05 · 21587 阅读 · 0 评论 -
排序算法之冒泡排序(C/C++)
冒泡法排序:时间复杂度O(n*n)比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数重复以上工作,直到最后排序完成void bubble_sort(int a[], int n){ int i = 0, j = 0, tmp = 0, exc原创 2017-01-17 17:09:53 · 375 阅读 · 0 评论 -
逆转一个链表
在一个list中,我们先让头结点的next域指向结点2,再让结点1的next域指向结点3,最后将结点2的next域指向结点1,就完成了第一次交换,顺序就变成了Header-结点2-结点1-结点3-结点4-NULLtypedef struct _list_t{ struct _list_t *next; int data;}list;void reverse_l原创 2017-01-17 20:41:18 · 293 阅读 · 0 评论 -
二分法查找(C/C++)
当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的,默认是按 升序 排好的。时间复杂度:O(logn)集合中的set和map中使用二分法进行查找的。int BiSearch(char *str, int n, char find) //返回值是:下标{ int low = 0, mid = 0, upper = n-1; if ((NULL原创 2017-01-17 20:21:13 · 691 阅读 · 0 评论 -
排序算法之两路归并排序(Java)
将2个有序的数组合并为一个有序的数组 时间复杂度为O(nlogn)默认是按升序进行排序:public class MergeSort { public static int[] sort(int[] data, int low, int high) { int mid = (low + high) / 2; if (lo原创 2017-01-18 12:58:30 · 902 阅读 · 0 评论 -
排序算法之快速排序(Java)
快速排序 平均时间复杂度 O(NlogN) 最差时间复杂度O(N*N) 不稳定它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 /** * 1.先从数列中取出一个数作为基准数。原创 2017-01-18 13:35:36 · 178 阅读 · 0 评论 -
排序算法之选择法排序(Java)
选择排序 时间复杂度 O(n*n) 不稳定的排序算法思想是:每一趟从待排序的数据元素中选出最小的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。下面是关键部分代码:public static void select_sort(int[] data){ int i = 0, j = 0, k = 0; int len = 0, tmp原创 2017-01-18 13:59:24 · 527 阅读 · 0 评论 -
排序算法之简单插入法排序(Java)
简单插入排序 时间复杂度 O(n*n) 稳定的排序算法逐一取出元素,在已排好的元素序列中从后向前扫描,插入到适当的位置部分代码如下: public static void insert_sort(int[] data) { int i= 0; int j = 0; int len = 0; int原创 2017-01-18 14:21:11 · 856 阅读 · 0 评论 -
排序算法之希尔排序(Java)
希尔排序 平均时间复杂度:O(nlogn) 不稳定的排序算法v[0]与v[0+n/2]比较,v[1]与v[1+n/2]比较,v[2]与v[2+n/2]比较,小的放到前面,以此类推..............关键部分代码如下:public static void shell_sort(int[] data){ int group = 0; int i = 0原创 2017-01-18 14:25:08 · 208 阅读 · 0 评论 -
排序算法之冒泡排序(JAVA)
//冒泡排序算法 平均时间复杂度 O(n*n) 稳定的排序算法public class bubbleSort { public static void bubbleSort(int[] data) { int i = 0; int j = 0; int tmp = 0; int len原创 2017-01-15 15:34:27 · 250 阅读 · 0 评论