分治法:快速排序,3种划分方式,随机化快排,快排快,还是归并排序快?
快速排序不同于之前了解的分治,他是通过一系列操作划分得到子问题,不同之前的划分子问题很简单,划分子问题的过程也是解决问题的过程 我们通常划分子问题尽量保持均衡,而快排缺无法保持均衡 快排第一种划分子问题实现方式,左右填空的双指针方式 def partition_1(arr,low,high):
# 把基准元素取出来,留出一个空位,这里是在首位,这种留出空位的方式,比较容易理解
pivot = arr[low]
# 循环体终止条件,因为是先走右边再走左边,终止的
分治法:关于选择算法,找最大,找最小,同时找最大和最小,找第二大
找最大或者最小,蛮力算法为最优的算法,需要比较n-1次 # 这个已经是最优的算法了,比较n-1次
def findMax(arr):
max_pivot = arr[0]
for i in range(1,len(arr)):
if arr[i] > max_pivot:
max_pivot = arr[i]
return max_pivot
def findMin(arr):
min_pivot =
找中位数,找第k小,还存在问题
找第k小 上次介绍了找第二大使用的方法时,使用锦标赛的方法,找到最大,在最大的手下败将里找第二大,也就是亚军在冠军的手下败将里产生,亚军只败给过冠军,这种方法比较次数时(n-1) + (logn-1),这个时间复杂度最优的方案了为O(n) 那么怎么找第k大了,季军只能在冠军和亚军的手下败将里产生,第四名只能在前三名手下败将里产生。。。。这个方法也是O(n),但是需要记录每个选手的手下败将名单 还有一种分治的方案,思路来源于快排,快排每次划分子问题,划分成3个部分,小于pivot,等于pivot
分治法:BFPTR算法找第k小
BFPTR算法 来自于Blum、Floyd、Pratt、Rivest、Tarjan这5个人,一起发布了一篇名为 “Time bounds for selection” 的论文,有兴趣可以看一下:https://pan.baidu.com/s/1QEWjZBrjEJ7zTIrI99sFYA。 下面是一种实现方式,这种有一个问题,只是找到中位数了,标号还要搜索然后此时的数组是有结构规律的,划分数组的时候使用的是快排的划分,没有用到这里insert_sort排序产生的局部有序的特征,改进优化方法:在
算法优化:最大字段和,双指针遍历(n^2),分治法(nlogn),动态规划(n)
最大字段和,有点类似与最长公共子序列,这里是求连续一段求和最大的一段,比如[-2,11,-4,-4,13,-5,-2]最大求和的连续一段为11,-4,-4,13,和为16. 最基本的双针模型遍历,两个指针,分别代表最大和序列的起始和终止,算法时间复杂度O(n^2) # 以下算法时间复杂度O(n^2)
def maxSum(arr):
num = len(arr)
# 记录最好的结果,这个结果是一个不断逼近的过程
best_result_start =0
best
我的模型能跑多快——神经网络模型速度调研(一)
前言对于神经网络,我们更多谈的是其精度怎么样,有百分之零点几的提升。但是如果谈到速度的话,深度学习神经网络相比于传统的算法来说,速度恐怕没有那么快了。那么我们什么时候需要提升速度呢?假如有以下的场景:将模型运行在手机上需要实时的场景,比如高速摄像机捕捉动作在嵌
Flutter实践——实现一个动态页
作者:腾讯 - 小德(任晓帅 koudleren) 前言 Flutter是Google新出的跨平台开发框架,目前国内外已经有许多产品将Flutter用到正式的生产环境,本文用Flutter实现了一个瀑布流的动态页面。 动态页 1、页面效果 废话不多说,先上图,
一文应用 AOP | 最全选型考量 + 边剖析经典开源库边实践,美滋滋
前言 繁多的 AOP 方法该如何选择?应用的步骤过于繁琐,语法概念看得头晕脑胀? 本文将详细展示选型种种考量维度,更是砍掉 2 个经典开源库的枝节,取其主干细细体会 AOP 的应用思想和关键流程。一边实践 AOP 一边还能掌握开源库,岂不快哉! 一、6 个要点
(译)React-Router4的变化
原文地址:戳这里 项目地址:传送门 首先,这篇文章的目的并不是为了重新叙述一遍React-Router4的文档。接下来我要说的内容,将会覆盖React-Router的大多数API,但是真正的目的是揭开React-Router4成功的模式和策略。 在开始本文之
解决代码中重复的捕获 promise 错误的 try catch 语句
promise promise 的出现,提供了优雅的异步解决方式,但是,多个连续继发 promise 写法依然繁琐。 let promise = new Promise(function(resolve, reject){ // ... if(/*
前端埋点统计方案思考
埋点即监控用户在应用表现层的行为,于产品迭代而言至关重要。埋点数据分析是产品需求的 来源,检验功能是否达预期的 佐证。前端较服务端更接近用户,本小白将在此对前端埋点统计方案述说一二。 采集埋点数据可做如下分析(以百度统计为例): 将 用户属性、用户行为 转化
beta冲刺(5/7)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 推进后端完成安卓端接口的开发 在测试中发现返回地图接口存在错误(待修复) 推进前端完成美食排行榜界面 推进web端各个页面的相关接口对接 接下来的计划 & 还剩下哪些任务 协助整合安卓端各个页面 协助制作展示视频 有哪些收获、困难和疑问 收获:学会绘制矢量图,并转换成xml,为食堂平面图引导功能提供地图 组员2:赵畅 过去两天完成了哪些任务 根据项目需求写了一部分代码,修改
Spring Security(十五):5.6 Authentication
Thus far we have only taken a look at the most basic authentication configuration. Let’s take a look at a few slightly more advanced options for configuring authentication.到目前为止,我们只看了最基本的身份验证配置。我们来看一些稍微更高级的配置身份验证选项。 5.6.1 In-Memory Authentication We
google-命名约定
通用命名规则 总述 函数名,变量名,文件名要有描述性;少用缩写. 1.文件命名 文件名要全部小写,可以包含下划线()或连字符(-),没有约定,""更好些. my_useful_class.cc 2.类型命名 类型名称的每个单词首字母均大写,不包含下划线:MyExcitingClass, MyExcitingEnum. 所有类型命名--类,结构体,类型定义(typedef), 枚举,类型模板参数 -- 均使用相同约定 // 类和结构体
class UrlTable{}
class UrlTabl
I/O多路复用之select、poll、epoll
很早之前有写过篇IO多路复用的文章:https://www.cnblogs.com/klcf0220/archive/2013/05/14/3077003.html 参考链接:https://segmentfault.com/a/1190000003063859 select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同
算法优化:最大m个子段和,问题规模从1个子段和扩展到m个,动态规划
最大m个子段和,问题规模从1个子段和扩展到m个,动态规划 问题规模由2个决定,一是子段数m,二是元素个数n,准确的说是最后一个子段终止的标号 b(i,j)定义为:前j个元素中有i个子段,且第i个子段包含j,i个子段和为b(i,j) 那么原问题的最优解为max{b(m,j)},m<=j<=n 还是不是针对原问题动态规划,动态规划的问题是可能解,最后在可行解里面找最优解 根据b(i,j)定义,有两种情况,第一种情况arr[i]是第i个子段的一部分,那前面j-1的尾巴也是属于第i个子段,可以把前面j
今日推荐
周排行