精华内容
下载资源
问答
  • 数据结构——栈的详解

    万次阅读 多人点赞 2020-04-20 00:02:43
    栈和队列是两种重要的线性结构,从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表的子集。他们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,他们是和...

    栈和队列是两种重要的线性结构,从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表的子集。他们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,他们是和线性表大不相同的两类重要的的抽象数据类型。

    C语言中的栈

    栈的定义

    栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈低(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表(简称LIFO:Last in, First out.结构)。
    栈的示意图

    C语言中栈的基本操作

    栈的基本操作主要有:栈的初始化、判空、判满、取栈顶元素、在栈顶进行插入和删除。在栈顶插入元素称为入栈,在栈顶删除元素称为出栈

    栈的初始化

    栈和线性表类似,也有两种存储表示方法顺序栈链栈,链栈的操作是线性表操作的特例,操作比较容易实现。顺序栈即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,top = 0表示空栈。由于栈在使用的过程中所需要的大小难以估计,所以通常是先为栈分配一个基本容量,然后再使用的过程中,当栈的空间不够使用的时候再继续追加存储空间。我们以下述类型说明作为顺序栈的定义:

    typedef struct{
    	SDataType *base; //栈底指针
    	SDataType *top;  //栈顶指针
    	int StackSize;   //当前已经分配的存储空间,以元素为单位 
    }SqStack;
    

    栈的初始化操作为:按照设定的初始分配量进行第一次存储分配,这里使用==malloc()==函数来分配存储空间。malloc()函数的详细说明请看:malloc详细说明。base作为栈底指针,它始终指向栈底,所以s.top = s.base可以作为栈空的标记。top为栈顶指针,top的初值指向栈底。每当插入一个元素时top加1,弹出一个元素时top减1,因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上
    栈顶指针和栈中元素的关系图

    //初始化顺序栈,构造一个空栈
    Status InitStack(SqStack &S){
    	//分配存储空间 
    	S.base = (SDataType *)malloc(STACK_INIT_SIZE*sizeof(SDataType));
    	if(!S.base){
    		//如果分配失败,则返回error 
    		return OVERFLOW;
    	}
    	//S.top 始终指向栈顶元素的下一个位置 
    	S.top = S.base;    //初始状态下为空栈 
    	S.StackSize = STACK_INIT_SIZE;   //当前已经分配的存储容量为100个 
    	return OK;	
    }
    

    判断是否为空栈

    当我们弹出栈顶元素时,往往需要判断一下栈是否为空来防止发生下溢。上面我们说到==base作为栈底指针,它始终指向栈底,所以s.top = s.base可以作为栈空的标记。==所以我们可以这样判断栈是否为空:

    //判断是否为空栈
    void judgeNull(SqStack &s){
    	if(s.top == s.base){
    		printf("此栈为空栈!\n");
    	}else{
    		printf("此栈不为空栈!\n");
    	}
    }
    

    判断是否为满栈

    当我们使一个元素入栈的之前,我们往往需要判断一下栈是否为满栈,防止发生上溢的情况。因为我们定义了一个StackSize来表示当前已经分配的存储空间,所以我们可以用s.top - s.base 来算出当前已经使用的栈空间。所以当s.top - s.base == s.StackSize时表示已经满栈:

    //判断是否为满栈
    void judgeFull(SqStack &s){
    	if(s.top-s.base == s.StackSize){
    		printf("栈满!\n");
    	}else{
    		printf("栈未满!\n");
    	} 
    }
    

    入栈

    入栈时我们首先要判断栈是否为满栈,如果为满栈我们要首先追加存储空间,然后才能将元素入栈。realloc()函数详解请看realloc详解

    //入栈
    Status Push(SqStack &s,SDataType e){
    	SDataType *p;
    	//首先判断栈是不是满的(上溢) 
    	if(s.top-s.base == s.StackSize){
    		//追加空间 
    		p = (SDataType *)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SDataType));
    		if(!p){
    			//如果没有找到符合条件的存储空间,则返回error 
    			return OVERFLOW;
    		}
    		//成功找到则使s.base指向p 
    		s.base = p;
    		s.top = s.base + s.StackSize;
    		s.StackSize +=  STACKINCREMENT;
    	}
    	//先插入元素,然后将栈顶指针加 1 
    	*(s.top) = e;
    	s.top++;
    	return OK;
    }
    

    出栈

    出栈时我们首先要判断栈是否为空栈。如果栈已经空了,则返回error。

    //出栈
    Status Pop(SqStack &s,SDataType &e){
    	//判断是否会发生下溢 
    	if(s.top != s.base){
    		s.top--;    //先将栈顶指针减 1 
    		e = *(s.top);
    	}else{
    		return 0;
    	}
    	return e;
    }
    

    C语言实现栈的具体代码

    #include<stdio.h>
    #include<malloc.h>
    
    #define STACK_INIT_SIZE 100  //栈的初始容量 
    #define STACKINCREMENT 10    //容量增量
    #define OK 1 
    #define OVERFLOW -2
    typedef int SDataType;
    typedef int Status;
    
    typedef struct{
    	SDataType *base; //栈底指针
    	SDataType *top;  //栈顶指针
    	int StackSize;   //当前已经分配的存储空间,以元素为单位 
    }SqStack;
    
    //初始化顺序栈,构造一个空栈
    Status InitStack(SqStack &S){
    	//分配存储空间 
    	S.base = (SDataType *)malloc(STACK_INIT_SIZE*sizeof(SDataType));
    	if(!S.base){
    		//如果分配失败,则返回error 
    		return OVERFLOW;
    	}
    	//S.top 始终指向栈顶元素的下一个位置 
    	S.top = S.base;    //初始状态下为空栈 
    	S.StackSize = STACK_INIT_SIZE;   //当前已经分配的存储容量为100个 
    	return OK;	
    } 
    
    //入栈
    Status Push(SqStack &s,SDataType e){
    	SDataType *p;
    	//首先判断栈是不是满的(上溢) 
    	if(s.top-s.base == s.StackSize){
    		//追加空间 
    		p = (SDataType *)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SDataType));
    		if(!p){
    			//如果没有找到符合条件的存储空间,则返回error 
    			return OVERFLOW;
    		}
    		//成功找到则使s.base指向p 
    		s.base = p;  //系统会将原来的内容复制过来
    		s.top = s.base + s.StackSize;
    		s.StackSize +=  STACKINCREMENT;
    	}
    	//先插入元素,然后使栈顶指针加 1 
    	*(s.top) = e;
    	s.top++;
    	return OK;
    } 
    
    //出栈
    Status Pop(SqStack &s,SDataType &e){
    	//判断是否会发生下溢 
    	if(s.top != s.base){
    		s.top--;    //先将栈顶指针减 1 
    		e = *(s.top);
    	}else{
    		return 0;
    	}
    	return e;
    }
    
    //判断是否为空栈 
    void judgeNull(SqStack &s){
    	if(s.top == s.base){
    		printf("此栈为空栈!\n");
    	}else{
    		printf("此栈不为空栈!\n");
    	}
    }
    
    //判断是否为满栈
    void judgeFull(SqStack &s){
    	if(s.top-s.base == s.StackSize){
    		printf("栈满!\n");
    	}else{
    		printf("栈未满!\n");
    	} 
    } 
    
    int main(){
    	SqStack s;
    	SDataType element;
    	
    	InitStack(s);  //初始化栈
    	//将1-5入栈
    	for(int i=1;i<=10;i++){
    		Push(s,i);
    	}
    	
    	judgeNull(s);
    	judgeFull(s);
    	
    	printf("出栈:\n");
    	//只要栈不为空 
    	while(s.top != s.base){
    		Pop(s,element);    //出栈的元素用e接收 
    		printf("%d ",element);
    	}
    	
    	printf("\n"); 
    	judgeNull(s);
    	
    	return 0;
    	 
    } 
    

    C++中的栈

    C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:<algorithm >、<deque >、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。其中的<stack>就是栈。

    C++的STL已经将栈的操作都封装成了函数,我们只需要引进#include<stack>头文件即可使用。

    C++中栈的基本操作

    初始化

    我们可以直接使用stack<int> s;来创建一个空的 stack 对象。

    判断是否为空栈

    使用empty()函数来判断栈是否为空。
    empty()函数详解

    入栈

    使用push()函数来完成入栈操作。
    push()函数详解

    出栈

    使用pop()函数实现出栈
    pop()函数详解

    返回栈顶元素

    使用top()函数返回栈顶元素
    top()函数详解

    返回栈中元素数目

    使用size()函数返回栈中元素的数目。
    size()函数详解


    以上就是C语言和C++中栈的基本用法了,如果你觉得我的文章对你有用请点个赞支持一下吧,如果喜欢我写的文章那么请点个关注再走。
    嘿嘿
    下一篇将继续写数据结构的队列,后续将会再写一些有关栈和队列的具体应用。我是ACfun:一个成长中的程序猿,感谢大家的支持。

    展开全文
  • 数据结构之树

    万次阅读 多人点赞 2018-11-20 01:25:14
    在计算器科学中,树(英语:tree)是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它...

    本篇只涉及树的概念范围和应考思路,不涉及具体结构或算法的实现与思考

    1.树

    在计算器科学中,树(英语:tree)是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

        ①每个节点有零个或多个子节点;
        ②没有父节点的节点称为根节点;
        ③每一个非根节点有且只有一个父节点;
        ④除了根节点外,每个子节点可以分为多个不相交的子树;

    然后你要知道一大堆关于树的术语:度,叶子节点,根节点,父节点,子节点,深度,高度。

    二叉树

    二叉树:每个节点最多含有两个子树的树称为二叉树。(我们一般在书中试题中见到的树是二叉树,但并不意味着所有的树都是二叉树。)

    在二叉树的概念下又衍生出满二叉树和完全二叉树的概念

    满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上
    完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。

     

    算法实现(笑)

    二叉树:
     private static class TreeNode {
            int val;
            TreeNode left;
            TreeNode right;
    TreeNode(int x) { val = x; }
    }

    二叉树的遍历方式

    先序遍历:先根节点->遍历左子树->遍历右子树

    中序遍历:遍历左子树->根节点->遍历右子树

    后序遍历:遍历左子树->遍历右子树->根节点

    深度优先搜索(DFS)与广度优先搜索(BFS)

    实现:bfs=队列,入队列,出队列 一次访问一条路径;dfs=栈,压栈,出栈 一次访问多条路径(来自知乎)

    关系:用DFS解决的问题都可以用BFS解决。DFS易于编写(递归),时间消耗较少但是容易发生爆栈,而BFS可以控制队列的长度。

     


    2.动态查找树

    2.1 二叉查找树

    二叉查找树是二叉树的衍生概念:

    二叉查找树(英语:Binary Search Tree),也称为二叉搜索树、有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

        1.若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
       2. 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
        3.任意节点的左、右子树也分别为二叉查找树;
        4.没有键值相等的节点。

    二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低为 O ( log ⁡ n ) 。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。

    2.2 平衡二叉树(AVL树)

    平衡二叉树:当且仅当任何节点的两棵子树的高度差不大于1的二叉树;

    其中AVL树是最先发明的自平衡二叉查找树,是最原始典型的平衡二叉树。

    平衡二叉树是基于二叉查找树的改进。由于在某些极端的情况下(如在插入的序列是有序的时),二叉查找树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n)。所以我们通过自平衡操作(即旋转)构建两个子树高度差不超过1的平衡二叉树。

    具体可以参阅1962年G.M. Adelson-Velsky 和 E.M. Landis的论文"An algorithm for the organization of information"。(这个坑我会以后补)


    2.3 红黑树

    红黑树也是一种自平衡的二叉查找树。


        1.每个结点要么是红的要么是黑的。(红或黑)
        2.根结点是黑的。  (根黑)
        3.每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。  (叶黑)
        4.如果一个结点是红的,那么它的两个儿子都是黑的。  (红子黑)
         5.对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。(路径下黑相同)

    如图就是一棵典型的红黑树。保证红黑树满足它的基本性质,就是在调整数据结构自平衡。

    而红黑树自平衡的调整操作方式就有旋转和变色两种。

    红黑树是一种应用很广的数据结构,如在Java集合类中TreeSet和TreeMap的底层,C++STL中set与map,以及linux中虚拟内存的管理。

    2.4 哈夫曼树(Huffman Tree)

    哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。

    一般可以按下面步骤构建:

    1,将所有左,右子树都为空的作为根节点。
    2,在森林中选出两棵根节点的权值最小的树作为一棵新树的左,右子树,且置新树的附加根节点的权值为其左,右子树上根节点的权值之和。注意,左子树的权值应小于右子树的权值。
    3,从森林中删除这两棵树,同时把新树加入到森林中。
    4,重复2,3步骤,直到森林中只有一棵树为止,此树便是哈夫曼树。

    大家可能更多听说的是哈夫曼编码,其实就是哈夫曼树的应用。即如何让电文中出现较多的字符采用尽可能短的编码且保证在译码时不出现歧义。

     

    3.多路查找树

    大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。


    3.1 B树

    B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一个一般化的二叉查找树(binary search tree),可以拥有最多2个子节点。与自平衡二叉查找树不同,B树适用于读写相对大的数据块的存储系统,例如磁盘。


    1.根结点至少有两个子女。

    2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

    3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

    4.所有的叶子结点都位于同一层。

    5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

    如图所示就是一颗符合规范的B树,由于相比于磁盘IO的速度,内存中的耗时几乎可以省略,所以只要树的高度足够低,IO次数足够小,就可以提升查询性能。

    B树的增加删除同样遵循自平衡的性质,有旋转和换位。

    B树的应用是文件系统及部分非关系型数据库索引。

    3.2 B+树

    B+ 树是一种树数据结构,通常用于关系型数据库(如Mysql)和操作系统的文件系统中。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入,这与二叉树恰好相反。

    在B树基础上,为叶子结点增加链表指针(B树+叶子有序链表),所有关键字都在叶子结点 中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中。

    b+树的非叶子节点不保存数据,只保存子树的临界值(最大或者最小),所以同样大小的节点,b+树相对于b树能够有更多的分支,使得这棵树更加矮胖,查询时做的IO操作次数也更少。

     

    这通常在多数节点在次级存储比如硬盘中的时候出现。通过最大化在每个内部节点内的子节点的数目减少树的高度,平衡操作不经常发生,而且效率增加了。

    3.3 B*树


    B*树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针

    在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3。


    3.4 R树

    R树是用来做空间数据存储的树状数据结构。例如给地理位置,矩形和多边形这类多维数据建立索引。

    R树的核心思想是聚合距离相近的节点并在树结构的上一层将其表示为这些节点的最小外接矩形(MBR),这个最小外接矩形就成为上一层的一个节点。因为所有节点都在它们的最小外接矩形中,所以跟某个矩形不相交的查询就一定跟这个矩形中的所有节点都不相交。叶子节点上的每个矩形都代表一个对象,节点都是对象的聚合,并且越往上层聚合的对象就越多。也可以把每一层看做是对数据集的近似,叶子节点层是最细粒度的近似,与数据集相似度100%,越往上层越粗糙。

    展开全文
  • C语言简单读取文件数据

    万次阅读 多人点赞 2018-10-22 18:42:56
    在已创建好的文件score1.txt中有两列数据(学号,成绩),现将数据从文件读出放入到两个数组num[]和score[]中,通过输入的学号查找成绩。 /** 知道学号查成绩 *在已创建好的文件score1.txt中有两列数据(学号,成绩...

    在已创建好的文件score1.txt中有两列数据(学号,成绩),现将数据从文件读出放入到两个数组num[]和score[]中,通过输入的学号查找成绩。

    /** 知道学号查成绩
     *在已创建好的文件score1.txt中有两列数据(学号,成绩),
     *现将数据从文件读出放入到两个数组num[]和score[]中。通过
     * 学号去操作数组查找成绩
     */
    
    #include<stdio.h>
    #include<stdlib.h>
    
    int main()
    {
        int num[200],score[200],fdnum;
        int i=0;
        FILE *fp;
        if((fp=fopen("score1.txt","r"))==NULL)  //打开文件
        {
            printf("Can not open file!\n");
            exit(1);
        }
        while(!feof(fp))    //读取到文件尾
        {
            fscanf(fp,"%d %d",&num[i],&score[i]);
            i++;
        }
        //现在来按学号查找成绩
        printf("请输入查找学号:");
        scanf("%d",&fdnum);
        for(i=0;i<200;i++)
            if(num[i]==fdnum)
            {
                printf("学号 %d 的成绩是 %d",fdnum,score[i]);
                break;
            }
        if(i>=200)
            printf("不存在学号是 %d 的同学!\n",fdnum);
        return 0;
    }
    
    执行结果

    在这里插入图片描述

    小结

    循环读取语句还可写为:

    while(fscanf(fp,"%d %d",&num[i],&score[i])!=EOF)    //读取到文件尾
            i++;
    
    展开全文
  • 区块链 (数据结构)

    千次阅读 2019-04-17 09:37:57
    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。 区块链(Blockchain),是比特币的一个重要概念,它本质上是一个去中心化的数据库,同时作为比特币的底层技术,是一串...
    	区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。
    

    区块链(Blockchain),是比特币的一个重要概念,它本质上是一个去中心化的数据库,同时作为比特币的底层技术,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。
    含义编辑
    狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构, 并以密码学方式保证的不可篡改和不可伪造的分布式账本。

    广义来讲,区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算方式 。
    架构模型:
    一般说来,区块链系统由数据层、网络层、共识层、激励层、合约层和应用层组成。 其中,数据层封装了底层数据区块以及相关的数据加密和时间戳等基础数据和基本算法;网络层则包括分布式组网机制、数据传播机制和数据验证机制等;共识层主要封装网络节点的各类共识算法;激励层将经济因素集成到区块链技术体系中来,主要包括经济激励的发行机制和分配机制等;合约层主要封装各类脚本、算法和智能合约,是区块链可编程特性的基础;应用层则封装了区块链的各种应用场景和案例。该模型中,基于时间戳的链式区块结构、分布式节点的共识机制、基于共识算力的经济激励和灵活可编程的智能合约是区块链技术最具代表性的创新点 。
    在这里插入图片描述
    区块链分为三类,在货币发行的《区块链:定义未来金融与经济新格局》 一书中就有详细介绍,其中混合区块链和私有区块链可以认为是广义的私链。
    公有区块链:
    公有区块链(Public Block Chains)是指:世界上任何个体或者团体都可以发送交易,且交易能够获得该区块链的有效确认,任何人都可以参与其共识过程。公有区块链是最早的区块链,也是应用最广泛的区块链,各大bitcoins系列的虚拟数字货币均基于公有区块链,世界上有且仅有一条该币种对应的区块链。
    联合(行业)区块链:
    行业区块链(Consortium Block Chains):由某个群体内部指定多个预选的节点为记账人,每个块的生成由所有的预选节点共同决定(预选节点参与共识过程),其他接入节点可以参与交易,但不过问记账过程(本质上还是托管记账,只是变成分布式记账,预选节点的多少,如何决定每个块的记账者成为该区块链的主要风险点),其他任何人可以通过该区块链开放的API进行限定查询。
    私有区块链:
    私有区块链(Private Block Chains):仅仅使用区块链的总账技术进行记账,可以是一个公司,也可以是个人,独享该区块链的写入权限,本链与其他的分布式存储方案没有太大区别。(Dec2015)保守的巨头(传统金融)都是想实验尝试私有区块链,而公链的应用例如bitcoin已经工业化,私链的应用产品还在摸索当中。

    具体特征编辑

    1.去中心化。由于使用分布式核算和存储,体系不存在中心化的硬件或管理机构,任意节点的权利和义务都是均等的,系统中的数据块由整个系统中具有维护功能的节点来共同维护。
    2.开放性。系统是开放的,除了交易各方的私有信息被加密外,区块链的数据对所有人公开,任何人都可以通过公开的接口查询区块链数据和开发相关应用,因此整个系统信息高度透明。
    3.自治性。区块链采用基于协商一致的规范和协议(比如一套公开透明的算法)使得整个系统中的所有节点能够在去信任的环境自由安全的交换数据,使得对“人”的信任改成了对机器的信任,任何人为的干预不起作用。
    4.信息不可篡改。一旦信息经过验证并添加至区块链,就会永久的存储起来,除非能够同时控制住系统中超过51%的节点,否则单个节点上对数据库的修改是无效的,因此区块链的数据稳定性和可靠性极高。
    5.匿名性。由于节点之间的交换遵循固定的算法,其数据交互是无需信任的(区块链中的程序规则会自行判断活动是否有效),因此交易对手无须通过公开身份的方式让对方对自己产生信任,对信用的累积非常有帮助。

    区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。 如果说蒸汽机释放了人们的生产力,电力解决了人们基本的生活需求,互联网彻底改变了信息传递的方式,那么区块链作为构造信任的机器,将可能彻底改变整个人类社会价值传递的方式。

    展开全文
  • 数据结构实验报告(一)

    千次阅读 2017-09-19 00:56:37
    数据结构实验报告(一) 一、实验名称 实验一 线性表的基本操作实现及其应用 二、实验目的 1、熟练掌握线性表的结构特点,掌握顺序表的基本操作。 2、巩固 C++相关的程序设计方法与技术。 3、学会使用顺序表解决...
  • 标题以下程序从读入的整数数据中,统计大于零的整数个数和小于零的整数个数。用输入零来结束输入,程序中用i统计大于零的个数,用变量j统计小于零的整数。 在这里插入代码片 #include<stdio.h> int main() { ...
  • 保证数据的完整性;当你删除学生信息时,与其有关的成绩信息同时清除;当你删除课程信息时,相应的与该课程有关的成绩信息也会被删除。(不过,还要设置其他的,为了保整完整性,附下图,注意黑框里面的属性) 小...
  • 数据模型的组成要素(1)数据结构(2)数据操作(3)数据的完整性约束条件4.概念模型(1)用途与基本要求(2) 信息世界中的基本概念(3)两个实体型之间的联系① 一对一联系(1:1)② 一对多联系(1:n)③ 多对多联系(m:n)(4)...
  • 用python爬取股票数据的一点小

    千次阅读 2018-09-25 15:20:55
    下面对近期学的东西进行一点点小。 二、股票数据爬取网站 网上更多推荐的是东方财富的股票数据,链接为:http://quote.eastmoney.com/stocklist.html 东方财富上能够获得所有股票的编号信息,有助于股票...
  • 在 ArcGIS 中,镶嵌数据集是用来管理大批量的栅格
  • 数据归一化小

    万次阅读 2016-05-09 14:46:53
    在各种模型训练,特征选择相关的算法中,大量涉及到数据归一化的问题。比如最常见的情况是计算距离,如果不同维度之间的取值范围不一样,比如feature1的取值范围是[100,200],feature2的取值范围是[1,2],如果数据不...
  • 上一篇帖子说明了如何创建镶嵌数据集,添加栅格数据
  • 数据降维方法小

    万次阅读 多人点赞 2015-09-05 10:22:56
    数据的形式是多种多样的,维度也是各不相同的,当实际问题中遇到很高的维度时,如何给他降到较低的维度上?前文提到进行属性选择,当然这是一种很好的方法,这里另外提供一种从高维特征空间向低纬特征空间映射的思路...
  • 数据结构小

    万次阅读 2019-04-23 20:25:57
    数据结构的分类: HashMap在jdk1.8之前和jdk1.8的区别: 如果要从链表转换为红黑树,要求数据是可比较的的
  • Python 数据相关性分析

    万次阅读 多人点赞 2018-04-25 15:09:49
    在我们的工作中,会有一个这样的场景,有若干数据罗列在我们的面前,这组数据相互之间可能会存在一些联系,可能是此增彼涨,或者是负相关,也可能是没有关联,那么我们就需要一种能把这种关联性定量的工具来对数据...
  • 数据库, 数据仓库, 数据集市,数据湖,数据中台

    千次阅读 多人点赞 2019-02-22 16:21:47
    数据仓库和数据集市的区别 作者:修鹏李 出处:CSDN 大数据:数据仓库和数据库的区别 作者:南宫蓉 出处:简书 第一篇:数据仓库概述 第二篇:数据库关系建模 作者:穆晨 出处:CNBLOS 摘要 本文简要介绍...
  • python中可变数据类型与不可变数据类型小

    万次阅读 多人点赞 2018-12-13 11:52:59
    一、python中数据类型(红色为可变类型) 1、字符串 str 2、布尔类型 bool 3、整数 int  4、浮点数 float 5、数字 (int和float)6、列表 list 7、元组 tuple8、字典 dict 9、日期 date 二、可变类型 可...
  • 这一贴,接着说镶嵌数据集的概视图(Overview)
  • 18大经典数据挖掘算法小

    万次阅读 多人点赞 2015-02-27 10:04:01
    大概花了将近2个月的时间,自己把18大数据挖掘的经典算法进行了学习并且进行了代码实现,涉及到了决策分类,聚类,链接挖掘,关联挖掘,模式挖掘等等方面。也算是对数据挖掘领域的小小入门了吧。下面就做个小小的...
  • CAD数据导入ArcGIS方法小

    万次阅读 2017-06-13 10:17:45
    一、常用方法: 1. 直接在ARCMAP(ARCGIS的桌面模式)中加载CAD的DWG格式文件,运用EXPORT DATA 命令输出shape数据...这种方法简单快速,且能保存完整CAD数据信息,但对CAD数据要求较高,需要CAD多线段闭合成
  • 概念数据模型、逻辑数据模型、物理数据模型

    万次阅读 多人点赞 2018-04-30 10:11:33
    最近在系统的学习数据库存储方面的知识加上在公司经常听同事们说起CDM,结合前段时间对MySQL的使用的心得将概念数据模型(Concept Data Model,CDM)、逻辑数据模型(Logical Data Model,LDM)、物理数据模型...
  • 本章小 在无序表或者有序表上的顺序查找, 其时间复杂度为O(n) 在有序表上进行二分查找, 其最差复杂度为O(log n) 散列表可以实现常数级时间的查找 完美散列函数作为数据一致性校验, 应用很广 区块链技术是一种去...
  • 关于echarts-formatter 数据格式化小

    万次阅读 2018-03-16 10:50:08
    一、tooltip中的数据格式(数据点的悬浮框)tooltip : { trigger: 'axis', formatter:function(a,b,c){ return a+'&lt;br/&gt;'+b+c; } },formatter格式化方法的参数说明:(下面一段话引用自...
  • 数据标准化/归一化normalization

    千次阅读 2018-10-05 08:22:40
    这里主要讲连续型特征归一化的常用方法。 连续型特征还有一种处理方式是,先分桶/分箱(如等频/...离散数据处理参考[数据预处理:独热编码(One-Hot Encoding)]。 基础知识参考: [均值、方差与协方差矩阵] [...
  • 数据量下排序算法小

    千次阅读 2018-07-25 00:18:11
    1.堆排序是处理数组中相隔较远的数据,快速排序是根据两个 指针按序遍历的,根据寄存器、高速缓存的热cache、 局部性原理,快排更好 2.快排的极端情况太难复现,而且可以 用随机基准数 3.快排还有各种优化的方案 ...
  • 数据预处理过程

    万次阅读 多人点赞 2018-12-27 16:50:05
    数据预处理过程会占用很多时间,虽然麻烦但也是必不可少且非常重要的一步。在数据能用于计算的前提下,我们希望数据预处理过程能够提升分析结果的准确性、缩短计算过程,这是数据预处理的目的。本文只说明这些预处理...
  • 平台提供附带标签训练数据集与不带标签的验证集,参赛选手提交验证集的预测结果,平台返回模型评价指标值。 其实就我们目前的烂水平来说做机器学习也没有我们太多事情,也就是安装好别人写好的函数库,导入数据,调...
  • 如题,整个四月份都用来学做这个赛题了,虽然是个数据挖掘比赛,但是B题是一个集合了对医学图像的图像分割和特征提取,图像分类的综合图像处理题,也是自己为了实践一下自己所学的一些知识的尝试,本科及以上组的...
  • 关于读入.properties配置文件数据,有很多方法,比如利用ResourceBundle.getString(“”),Property.getProperty(“”).toString(),@Value(“${}”),Environment.get等方法ResourceBundleSystem.setProperty(...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 461,953
精华内容 184,781
关键字:

数据结