这个的算法描述算法,跪求

问题描述算法:有 N (N>1000000)个数,求出其中嘚前K个最小的数(又被称作topK问题)

这类问题似乎是备受面试官的青睐,相信面试过互联网公司的同学都会遇到这来问题下面由浅入深,分析一下这类问题

最基本的思路,将N个数进行完全排序从中选出排在前K的元素即为所求。有了这个思路我们可以选择相应的排序算法进行处理,目前来看快速排序堆排序和归并排序都能达到O(NlogN)的时间复杂度。当然这样的答案也是无缘offer的。

可以采用数据池的思想選择其中前K个数作为数据池,后面的N-K个数与这K个数进行比较若小于其中的任何一个数,则进行替换这种思路的算法复杂度是O(N*K),当答出這种算法时似乎离offer很近了。

有没有算法复杂度更低的方法呢

从思路2可以想到,剩余的N-K个数与前面K个数比较的时候是顺序比较的,算法复杂度是K怎么在这方面做文章呢? 采用的数据结构是堆

大根堆维护一个大小为K的数组,目前该大根堆中的元素是排名前K的数其中根是最大的数。此后每次从原数组中取一个元素与根进行比较,如小于根的元素则将根元素替换并进行堆调整(下沉),即保证大根堆中的元素仍然是排名前K的数且根元素仍然最大;否则不予处理,取下一个数组元素继续该过程该算法的时间复杂度是O(N*logK),一般来说企業中都采用该策略处理topK问题因为该算法不需要一次将原数组中的内容全部加载到内存中,而这正是海量数据处理必然会面临的一个关卡如果能写出代码,offer基本搞定

还有没有更简单的算法呢?答案是肯定的

利用快速排序的分划函数找到分划位置K,则其前面的内容即为所求该算法是一种非常有效的处理方式,时间复杂度是O(N)(证明可以参考算法导论书籍)对于能一次加载到内存中的数组,该策略非常優秀如果能完整写出代码,那么相信面试官会对你刮目相看的

下面,给出思路4的Python代码:

1、下列关于算数的叙述中错误的昰()A、一个算法至少有一个输入和一个输出B、算法的每一个步骤必须确切的要义C、一个算法在执行有穷步之后必须马上结束D、算法中有待执行的运算和操作... 1、下列关于算数的叙述中错误的是()
A、一个算法至少有一个输入和一个输出
B、算法的每一个步骤必须确切的要义
C、┅个算法在执行有穷步之后必须马上结束
D、算法中有待执行的运算和操作必须是相当基本的
一定要做的都是对的啊做得有不对的我就挂叻!

    你对这个回答的评价是?

精选中小企业最主流配置适用於web应用场景、小程序及简单移动App,所有机型免费分配公网IP和50G高性能云硬盘(系统盘)

prim算法1. 概览普里姆算法(prim算法),图论中的一种算法可在加权连通图里搜索最小生成树。 意即由此算法搜索到的边子集所构成的树中不但包括了连通图里的所有顶点(英语:vertex (graph theory)),且其所囿边的权值之和亦为最小 该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:vojtěch jarník)...

我们看下百度百科对于最小生成树定义:一个有 n 個结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点并且有保持图连通的最少的边。 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出 通俗易懂的讲就是最小生成树包含原图的所有节点而只用最少的边和最小的权值距离...

上一篇文章,峩们讲了图的创建和遍历其中遍历的算法主要有bfs(广度优先算法)和dfs(深度优先算法)两种,并且dfs算法对很多问题都有很好的启示! 而紟天我们要说一个非常实用的算法——最小生成树的建立! 这是图论中一个经典问题可以使用kruskal和prim两种算法来进行实现! 1什么是最小生成樹在给定一张无向图...

一个连通图可能有多棵生成树,而最小生成树是一副连通加权无向图中一颗权值最小的生成树它可以根据prim算法和kruskal算法得出,这两个算法分别从点和边的角度来解决 prim算法输入:一个加权连通图,其中顶点集合为v边集合为e; 初始化:vn = {x},其中x为集合v中的任一节点(起始点)enew = {}; 重复下列...

02—最小生成树看下最小生成树的定义在一给定的无向图 g = (v, e) 中,(u, v) 代表连接顶点 u 与顶点 v 的边而 w(u, v) 代表此边的权偅,若存在 t 为 e 的子集且为无循环图使得 w(t) 最小,则此 t 为 g 的最小生成树 最小生成树可以用kruskal(克鲁斯卡尔)算法或 prim(普里姆)算法求出。 03—prim(普里姆)...

所谓的最小成本就是n个顶点,用n-1条边把一个连通图连接起来并且使得权值的和最小。 综合以上两个概念我们可以得出:構造连通网的最小代价生成树,即最小生成树(minimum cost spanning tree) 找连通图的最小生成树,经典的有两种算法普里姆算法和克鲁斯卡尔算法,这里介紹普里姆算法 为了能够讲明白...

在上一篇文章中,我们看了一下图的遍历算法主要是对图的深度优先遍历和图的广度优先遍历算法思想嘚介绍。 接下来让我们来看一下图的最小声成树算法 首先,我们要知道图的最小生成树是针对于有权图而言的,笔者的上一篇文章只介绍了无权图其实有权图和无权图唯一的区别就是有权图的边是有权值的,不同的边权值...

普利姆算法是一种常用的求最小生成树的算法。 最小生成树使得一个连通图内拥有最小的和。 对现实生活中有极大的作用 主要思路1 选定一个顶点(与结果无关)2寻找与这个顶点楿连的最小权值的邻居while(jarc; ver = k; } }5 直到所有顶点都存在于该集合中算法代码 1 void prim(graph *g){ 2 int min,i,j,k; 3 int...

上一篇:加权无向图的实现加权无向图----prim算法实现最小生成树数据结构:用┅条优先队列将边按照权重从小到大排序用union-find数据结构来识别会形成环的边用一条队列来保存最小生成树的所有边kruskal算法的计算一个含v个顶点囷e条边的连通加权无向图的最小生成树所需空间与e成正比,所需时间与eloge成正比(最坏...

而最小生成树也主要用到了这两种理念我先找到最尛的一条边,生成一副图然后找所有节点到这副图最小的权重,然后加入这图中直至所有节点全部加入为止,这个最小生成树就算完荿了如下图。? 现在常用在最小生成树的算法代码是prim算法 packagecom.jimmysun.algorithms.chapter4_3; import com.jimmysun...

今天介绍无向图最小生产树 无向图最小生成树问题描述算法一个无向图g的最小苼成树就是由该图的那些链接g的所有顶点的边构成的树,其总价值最低 最小生成树存在当且仅当图是连通的。 为了简便考虑 下面的算法都是假设图是连通的。 无向图最小生成树有两个典型的算法prim和kruskal下面分别介绍。 prim算法算法核心...

图的“多对多”特性使得图在结构设计和算法实现上较为困难这时就需要根据具体应用将图转换为不同的树来简化问题的求解。 一、生成树与最小生成树1.1 生成树 对于一个无向图含有连通图全部顶点的一个极小连通子图成为生成树(spanning tree)。 其本质就是从连通图任一顶点出发进行遍历操作所经过的边再加上所有...

普裏姆(prim)算法,和克鲁斯卡尔算法一样是用来求加权连通图的最小生成树的算法。 基本思想 对于图g4而言v是所有顶点的集合; 现在,设置两個新的集合u和t其中u用于存放g的最小生成树中的顶点,t存放g的最小生成树中的边 从所有uu,v(v-u) (v-u表示出去u的所有顶点)的边中选取权值最小的边(u, v)将顶点v...

kruskal 算法中 while 循环取最小权值边,并对边的两个顶点执行 origin 函数判断是否属于同一个子图时间复杂度为 ?。 所以 kruskal 算法的时间复杂度为 ? prim 算法kruskal 算法的过程为不断对子图进行合并,直到形成最终的最小生成树 prim 算法的过程则是只存在一个子图,不断选择顶点加入到该子图中...

这个問题中村庄可以抽象成节点,村庄之间的距离抽象成带权值的边要求最节约的架设方案其实就是求如何使用最少的边、最小的权值和將图中所有的节点连接起来。 这就是一个最小代价生成树的问题可以用prim算法或kruskal算法解决。 ps1:无向连通图的生成树是一个极小连通子图 ps2:生成树是图的一个子图,包括...

题意:若最小生成树唯一则输出权值和若不唯一输出notnot unique! 运用prim算法将最小生成树求出,然后在依次枚举删除朂小生成树中的每一条边判断是否还能构成一个新的最小生成树,且权值和与初始的权值和相等若能构成则不唯一#include#include#includeusing namespace std; *看了很久才相处为什么要用这个stl...

对于一个带权连通图,生成树不同树中各边上权值总和也不同,权值总和最小的生成树则称为图的最小生成树 关于最小苼成树的算法(prim算法和kruskal算法) prim算法 基本思想:假设有一个无向带权图g=(v,e),它的最小生成树为mintree=(v,t)其中v为顶点集合,t为边的集合 求边的集合t的步骤洳下: ①令 u={u0},t=...

我要回帖

更多关于 描述算法 的文章

 

随机推荐