堆排序   和 堆的大数据应用

//本次练习的是   堆排序   和  堆的大数据应用
//堆排序的时间复杂度为   O(n)
//堆的大数据应用应选择   小堆   进行处理
//但  当数据超过100000时速度明显变慢,可能是建立小堆的时候慢   》》》》》有没有更优的方法

#include<iostream>
#include<vector>
#include<time.h>
using namespace std;

//........................以下为  堆排序.....................................
void AdjustDownGreater(vector<int>& h,size_t size)//建立大堆
{
    if (size <= 1)        //注意参数检测啊....
    {
        return;
    }
    for (int parent = (size - 1 - 1) / 2; parent >= 0; parent--)    //经验:可以先写内层循环,再写外层循环
    {
        while(parent <= size - 1)
        {
            int leftcChild = 2 * parent + 1;

if (leftcChild + 1 <= size - 1 && h[leftcChild] < h[leftcChild + 1])
            {
                leftcChild++;
            }

if (leftcChild <= size - 1 && h[parent] < h[leftcChild])
            {
                swap(h[parent], h[leftcChild]);
                parent = leftcChild;
            }
            else
            {
                break;
            }
        }
    }
}

void HeapSort(vector<int>& h,size_t size)
{
    while (size > 1)
    {
        swap(h[0], h[size - 1]);
        size--;

AdjustDownGreater(h,size);
    }

}

void Print(vector<int>& h,size_t size)
{
    for (int i = 0; i < size; i++)
    {
        cout << h[i]<<"  ";
    }
}

void Test1()
{
    int arr[] = { 10, 16, 18, 12, 11, 13, 15, 17, 14, 19 };

vector<int> h;
    for (int i = 0; i < 10; i++)
    {
        h.push_back(arr[i]);
    }

AdjustDownGreater(h, 10);
    HeapSort(h, 10);
    Print(h, 10);
}

//..................................以下为堆大数据应用....................

//从n个数据中选出前k个最大的数        用的是  *******《小堆》**********************
//选择小堆的原因:用一个数组来存储k个数arr[k]   如果选出的第一个数就是最大的那个,那后面的就进不了arr了

const int N = 100000;       //当超过100000时速度明显变慢       《《《《有没有更优的方法》》》
const int K = 10;

void  GetData(vector<int>& h)
{
    srand(time(0));
    for (int i = 0; i < N; i++)
    {
        h.push_back(rand() % N + 1);
    }
}

void AdjustDownLess(vector<int>& h, size_t size)//建立小堆
{
    if (size <= 1)      
    {
        return;
    }
    for (int parent = (size - 1 - 1) / 2; parent >= 0; parent--)    
    {
        while (parent <= size - 1)
        {
            int leftcChild = 2 * parent + 1;

if (leftcChild + 1 <= size - 1 && h[leftcChild] > h[leftcChild + 1])
            {
                leftcChild++;
            }

if (leftcChild <= size - 1 && h[parent] > h[leftcChild])
            {
                swap(h[parent], h[leftcChild]);
                parent = leftcChild;
            }
            else
            {
                break;
            }
        }
    }
}

void GetGreatestK(vector<int>& h, vector<int>& greatest)
{
    AdjustDownLess(h, N);

for (int i = 0; i < K; i++)   //把前K个较小的push进去
    {
        greatest.push_back(h[i]);
    }

for (int index = K; index < N; index++)
    {
        AdjustDownLess(greatest, K);        //为了得到最小的数

if (h[index] > greatest[0])        //换掉最小的数
        {
            greatest[0] = h[index];
        }
    }
}

void Print(vector<int>& h)
{
    for (int i = 0; i < K; i++)
    {
        cout << h[i]<<"  ";
    }
}

void Test2()
{
    vector<int> h;
    vector<int> greatest;
    GetData(h);
    GetGreatestK(h, greatest);
    Print(greatest);
}

int main()
{
    //Test1();
    Test2();

return 0;
}

时间: 2024-10-07 15:50:34

堆排序   和 堆的大数据应用的相关文章

序列——堆排序-大根堆(堆大顶)

1.小根堆 如果根是儿童的存在留下的根值左孩子小于值:如果根是儿童的权利的存在的根值比他们的孩子的权利少值. 2.大根堆 如果根是儿童的存在留下的根值多名离开自己的孩子值.子女则根节点的值大于右子女的值. 3.结论 (1)堆是一棵全然二叉树(假设公有h层,那么1~h-1层均满,在h层连续缺失若干个右叶子). (2)小根堆的根节点的值是最小值,大根堆的根节点的值是最大值. (3)堆适合于採用顺序存储. 4.堆的插入算法 将一个数据元素插入到堆中,使之依旧成为一个堆. 算法描写叙述:先将结点插入到堆

堆排序——大根堆(大顶堆)

1.小根堆 若根节点存在左子女则根节点的值小于左子女的值:若根节点存在右子女则根节点的值小于右子女的值. 2.大根堆 若根节点存在左子女则根节点的值大于左子女的值:若根节点存在右子女则根节点的值大于右子女的值. 3.结论 (1)堆是一棵完全二叉树(如果公有h层,那么1~h-1层均满,在h层连续缺失若干个右叶子). (2)小根堆的根节点的值是最小值,大根堆的根节点的值是最大值. (3)堆适合于采用顺序存储. 4.堆的插入算法 将一个数据元素插入到堆中,使之依然成为一个堆. 算法描述:先将结点插入到

大数据量处理

1.100亿个数字找出最大的10个 1.首先一点,对于海量数据处理,思路基本上是确定的,必须分块处理,然后再合并起来. 2.对于每一块必须找出10个最大的数,因为第一块中10个最大数中的最小的,可能比第二块中10最大数中的最大的还要大. 3.分块处理,再合并.也就是Google MapReduce 的基本思想.Google有很多的服务器,每个服务器又有很多的CPU,因此,100亿个数分成100块,每个服务器处理一块,1亿个数分成100块,每个CPU处理一块.然后再从下往上合并.注意:分块的时候,

大数据就是这么任性第一季数据结构和算法(一线经验、权威资料、知识新鲜、实践性强、全程源码)

这门课程是针对大数据工程师和云计算工程师的基础课程,同时也是所有计算机专业人士必须掌握的一门课程. 如果不掌握数据结构和算法,你将难以掌握高效.专业的数据处理手段,更难以从容应对复杂的大数据处理场景. 请思考以下问题: 1.社交网站(如微博.facebook)中,人与人的关系是海量数据,你如何研究和处理此问题? 2.数据库的索引作用是什么?为什么利用哈希.B+树和堆表等数据结构来组织索引? 3.为什么Linux的虚拟内存管理模块,使用红黑树来处理VMA的查找? 4.为什么搜索引擎可以在毫秒级返回

大数据工程师在阿里面试流程是什么?

全中国的IT公司只想去阿里,因为阿里真的是中国程序员的朝圣地,进去真的能学很多.最终经历了5轮面试,顺利拿到了offer.这里和大家分享一下我的面试经验. 一面过程 首先是一次不记名面试,这里我也真的很感谢这场不记名面试了,如果没有这场不记名面试,我可能真的一面就结束了.因为我之前是没有任何找工作的面试经验的,再加上去阿里对我来说真的是一件几个月做梦都会梦到的事情,我把它看的太重了,所以在面试之前我经历人生中最紧张最紧张的一段时间,导致这次面试基本是全面GG.我先来说一下这次面试的过程吧. 面试

大数据面试题分析

最近学习了hashtable的一点知识,发现可以用来解决大数据的一些问题.我们这里讲的大数据分析事实上并不是分布式和数据挖掘这些高深的概念,而是针对从从一个大文件或者一堆数据(内存放不下)中找出具有某种特点的数,这也是近年来各大公司经常考的问题. 面试题1:给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 解析:100G的文件给我们的感觉是太大,我们的电脑内存一般都为4G左右所以不可能一次性把这么多的信息都加载到内存,所以就要进行切分成10

合格大数据分析师应该具备的技能

阶段一.业务数据分析师 课程一.数据挖掘/分析师之硬技能 - 必备常用工具使用与高级技巧 本部分内容主要介绍了数据挖掘.分析师.数据产品经理必备的常用工具的,主要有 Excel,Visio,Xmind,PPT的涉及图表数据分析方面的高级技巧,包括但不限于:数据透视表演练.Vision跨职能流程图演练.Xmind项目计划导图演练.PPT高级动画技巧等! 一.Excel 1)数据分析工具EXECL入门介绍2)数据透视表演练 3) 数据处理4) EXECL报告自动化5) PPT报告数据自动化 二.Vi

大数据常见错误

1.用./bin/spark-shell启动spark时遇到异常:java.net.BindException: Can't assign requested address: Service 'sparkDriver' failed after 16 retries! 解决方法:add export SPARK_LOCAL_IP="127.0.0.1" to spark-env.sh 2.java Kafka producer error:ERROR kafka.utils.Util

mysql大数据高并发处理(转)

一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程. 所以在考虑整个系统的流程的时候,我们必须