二叉查找树(通过外排思想处理大数据)

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 因为要读的文件很大 ,不能直接一次读进数组,需要通过读一部分,释放内存,再读的方式来解决, 因为直接插入二叉查找(排序)树,则不需要再将排序好的数据先放入别的文件。

因为要读的文件很大 ,不能直接一次读进数组,需要通过读一部分,释放内存,再读的方式来解决, 因为直接插入二叉查找(排序)树,则不需要再将排序好的数据先放入别的文件。

#include <stdio.h>
#include <windows.h>
#include <stack>
#include <iostream>
using namespace std;
typedef int ElementType; 
typedef struct TreeNode *Tree;
typedef struct TreeNode *Position;
#define N 250000    //行
#define L 2     //列
const char file_name[50] = "hjy123.txt";
void InOrder( Tree T);
Tree Delete(ElementType X,Tree T);
Tree Insert(ElementType X,Tree T);
Position Find( ElementType X,Tree T);

Position FindMin( Tree T);
struct TreeNode{
    ElementType Data;
    Tree Left,Right;
};
Tree BST = NULL;
void main() {   
    system("color f0");
    int i,j;
    FILE *fp;
    fp=fopen(file_name, "rb");
    long count ;    //记数器,记录已读出的整数
    long **data;
    data=(long **)malloc(N * sizeof(long *));   //分配指向行的指针数组  
    for(i=0;i<N;i++) {
        data[i]=(long *)malloc(L*sizeof(long));  //分配行指针所指向的数组
        //动态二维数组的建立(行列限制内存大小)
    }
    long temp;

    for(int a = 0; a < 200; a++){
        long index[N] = {0};
        count = 0;
        while( 1 == fscanf(fp, "%d", &temp)     ) {
            data [(index[count%L])++] [count%L] = temp;
            count++;
            if(count == 500000) break;
        } 
        for(i = 0,j = 0; i < N ; i++ ) {
            if(data[i][j] == 1) {
                BST = Insert(data[i][j+1],BST);
            } else if(data[i][j] == 2) { 
                if(Find(data[i][j+1],BST) != NULL)      
                    printf("数据%d:查找成功!\n",data[i][j+1]);
                else    
                    printf("数据%d:查找失败!\n",data[i][j+1]);
            } else if(data[i][j] == 3) {
                Delete(data[i][j+1],BST); 
                    printf("数据%d:删除成功!\n",data[i][j+1]);
            } else if(data[i][j] == 0) {
                fclose(fp);
                printf("中序遍历结果如下:\n");
                InOrder(BST);
                printf("\n");
                for(int k=0; k < L; k++){   
                    free(data[k]); //释放所有行空间  
                }  
                free(data); //释放行指针数组 
                exit(0);
            } 
        }
    }
}
Position Find( ElementType X,Tree T) {  //查找
    if(T != NULL){
        if( X < T->Data )       return Find( X, T->Left);
        else if( X > T->Data)   return Find( X, T->Right);
        else                    return T;
    }  
    else    
        return NULL;
}
Tree Insert(ElementType X,Tree T) {     //插入
    if(T == NULL) { //当树为空树  初始化树根
        T = (Tree)malloc(sizeof(struct TreeNode ));
        T->Data = X;
        T->Left = T->Right = NULL;
    }
    else if( X < T->Data)   T->Left = Insert(X, T->Left);
    else if( X > T->Data)   T->Right = Insert(X, T->Right);
    return T;
}
void InOrder(Tree T) {  //非递归中序遍历
    stack<Tree> s;
    Tree P = T;
    while(P != NULL || !s.empty() ) {
        while(P != NULL) {  
            s.push(P);  //压入
            P = P->Left;
        }
        if(!s.empty()) {
            P = s.top();    //取栈顶
            printf("%d ",P->Data);
            s.pop();
            P = P->Right;
        }
    }
}
Position FindMin( Tree T) {     //非递归实现方法
    if( T!=NULL) 
        while(T->Left != NULL)
            T = T->Left;
        return T;
}
Tree Delete(ElementType X, Tree T) {    //删除  分两种情况  
    Position Tmp;
    if(X < T->Data )
        T->Left = Delete( X, T->Left);
    else if(X > T->Data)
        T->Right = Delete( X, T->Right);
    else{   //找到要删除的结点
        if( T->Left && T->Right) {  //被删除结点有左右两个子结点
            Tmp = FindMin( T->Right);   //在右子树中找最小元素填充删除元素
            T->Data = Tmp->Data;
            T->Right = Delete( T->Data, T->Right);
            free( Tmp );            //大数据必须释放内存
        } else {    //被删除结点有一个或无子结点
            Tmp = T;
            if( !T->Left )
                T = T->Right;
            else if( !T->Right)
                T = T->Left;
            free(Tmp);
        }
    }
    return T;   
}
相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
3月前
|
存储 大数据 索引
解锁Python隐藏技能:构建高效后缀树Suffix Tree,处理大数据游刃有余!
通过构建高效的后缀树,Python程序在处理大规模字符串数据时能够游刃有余,显著提升性能和效率。无论是学术研究还是工业应用,Suffix Tree都是不可或缺的强大工具。
65 6
|
5月前
|
存储 大数据 索引
解锁Python隐藏技能:构建高效后缀树Suffix Tree,处理大数据游刃有余!
【7月更文挑战第19天】Suffix Tree 概述:** 为高效处理字符串搜索、匹配和大数据分析,后缀树是一种优化数据结构,可快速检索后缀、执行最长公共后缀查询及字符串排序。Python中虽无内置实现,但可通过第三方库或自建代码构造。应用于字符串搜索、生物信息学等领域,提升大数据处理效率。
118 3
|
6月前
|
存储 NoSQL 大数据
【大数据】LSM树,专为海量数据读写而生的数据结构
【大数据】LSM树,专为海量数据读写而生的数据结构
182 0
|
7月前
|
存储 算法 NoSQL
【云计算与大数据技术】Bloom Filter、LSM树、Merkle哈希树、Cuckoo哈希等数据结构的讲解(图文解释 超详细)
【云计算与大数据技术】Bloom Filter、LSM树、Merkle哈希树、Cuckoo哈希等数据结构的讲解(图文解释 超详细)
80 0
|
算法 搜索推荐 大数据
大数据开发基础的数据结构和算法的数据结构的树
当今时代,数据在我们生活中扮演着越来越重要的角色。大数据的处理和管理已经成为了许多企业不可或缺的一部分。而在这些数据中,树结构是最常用的数据结构之一。
113 0
|
数据采集 机器学习/深度学习 算法
大数据分析案例-基于决策树算法构建员工离职预测模型
大数据分析案例-基于决策树算法构建员工离职预测模型
4137 0
大数据分析案例-基于决策树算法构建员工离职预测模型
|
JSON 前端开发 JavaScript
|
人工智能 算法 大数据
【BABY夜谈大数据】决策树
最近阿法狗好火,所以就特地讲下决策树。决策树(Decision Tree)是一种简单但是广泛使用的分类器。通过训练数据构建决策树,可以高效的对未知的数据进行分类。学会可以帮你选择女朋友!
|
1月前
|
存储 分布式计算 数据挖掘
数据架构 ODPS 是什么?
数据架构 ODPS 是什么?
332 7