![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
XTreeZhao
大厂后端开发
️当前在字节跳动服役,也曾服役于腾讯。
主力武器:Golang
希望和大家持续分享后端相关知识,共同学习进步
展开
-
寻找最大的K个数
无序的N个数,求其中最大的K个数(转载自编程之美)思路1:排序 快排或堆排序后取最大的K个数,时间复杂度O(NlogN)。 但后N-K个数的排序是无必要的,因此可采用选择排序或交换排序进行部分排序,时间复杂度O(N*K)。思路2:利用快排partition 快速排序的partition是把N个数分成2部分,前半部分均小于pivot,后半部分均大于pivot。 先利用partition将N分转载 2015-09-22 11:25:24 · 388 阅读 · 0 评论 -
快速排序
快速排序是采用分而治之策略的排序算法核心 partition函数,返回mid位置 使得 arr[begin], arr[begin+1], ..., arr[mid-1] <= arr[mid] <= arr[mid+1], arr[mid+2], ..., arr[end]partition函数的实现方案A (partition1): 1. 确定pivot元素(可使用arr[begin]或a原创 2015-09-11 10:04:57 · 274 阅读 · 0 评论 -
二叉树的深度优先和广度优先遍历
图的深度优先搜索法是树的先根遍历的推广它的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再 从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续。如果当前被访问过的顶点的所有邻接顶点都已被访问,则退回到已被访问的顶点序列中 最后一个拥有未被访问的相邻顶点的顶点w,从w出发按同样的方法向前遍历,直到图中所有顶点都被访问。 图的广度转载 2015-09-10 11:13:44 · 321 阅读 · 0 评论 -
归并排序
归并排序采用分而治之(divide and conquer)的策略。 归并步骤 divide 把长度为n的输入序列分成两个长度为n/2的子序列 conquer 对这两个子序列分别采用归并排序 conbine 将两个排序好的子序列合并成一个最终的排序序列时间复杂度 O(NlogN)cpp实现#include <iostream>using namespace std;template<t原创 2015-09-11 09:41:57 · 345 阅读 · 0 评论 -
海量数据处理
1 、海量日志数据,提取出某日访问百度次数最多的那个 IP。 算法思想:分而治之+Hash1.IP 地址最多有 2^32=4G种取值情况,所以不能完全加载到内存中处理;2.可以考虑采用“分而治之”的思想,按照 IP地址的Hash(IP)%1024 值,把海量 IP 日志分别存储到 1024 个小文件中。这样,每个小文件最多包含 4MB 个 IP 地址;3.对于每一个小文件,可以构建一个 IP 为转载 2015-09-10 15:32:51 · 264 阅读 · 0 评论 -
常用排序汇总
1.稳定性比较 插入排序、冒泡排序、二叉树排序、二路归并排序及其他线形排序是稳定的 选择排序、希尔排序、快速排序、堆排序是不稳定的2.时间复杂性比较 排序方法 平均情况 最好情况 最坏情况 归并排序 O(nlogn) O(nlogn) O(nlogn) 基数排序 O(n) O(n) O(n) 快速排序 O(nlogn) O(nlogn)转载 2015-09-10 11:24:03 · 392 阅读 · 0 评论 -
堆排序
性质 堆是一棵完全二叉树,因此可用数组进行模拟。 设数组为heap[size+1],第一个元素为控制边界用,赋值以很小的数。这样上调过程中不用另加判断。 arr[i]的左右子女分别为arr[2*i]和arr[2*i+1],arr[i]的父亲为arr[i/2],注意此时根节点从1开始。结构定义、初始化typedef struct { int capacity; int size;原创 2015-09-22 21:07:22 · 337 阅读 · 0 评论