当前位置: 首页 > news >正文

《大数据算法》一2.4 数组有序的判定算法

本节书摘来华章计算机《大数据算法》一书中的第2章 ,第2.4节,王宏志 编著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4 数组有序的判定算法

本节讨论数组有序的判定问题的判定算法。
1.问题的定义
数组有序的判定问题
输入:包含n个数的数组A。
输出:若A中元素单调递增则输出“是”;否则输出“否”。
首先看一下这个问题的定义,输出是判定的结果,这个数组是否有序?如果需要精确地回答这个问题,就需要访问n个数,时间是Ω(n)。但是要求是设计亚线性算法,就是不访问所有的数据也能完成判定,所以采用近似算法。
要定义近似,需要用到ε-远离的概念。在这个问题中,ε-远离意味着必须删除大于εn个元素才能保证剩下的元素有序。这个问题的近似版本就变成:这个数组有序还是删除大于εn个元素才能保证有序?
2.近似求解
下面说明怎样设计一个亚线性算法才能解决这个问题。提到亚线性,读者可能直接想到采取抽样的方法,这是可以的。但是如何抽样,如何处理,如何证明抽样的正确性就不那么直观了。算法2-6 数组有序的判定算法

for k=1 to 2/ε do
  选择数组中第i个元素xi
  用xi在数组中做二分查找
  if发现i<j 但是xi>xj then //碰到了“坏”索引
    return false
return true

定理2-7和定理2-8分别描述了该算法的时间复杂度和精度。
定理2-7 算法2-6是亚线性算法。
证明 算法2-6的时间复杂度是2/ε乘以二分查找的代价O(logn),即O2εlogn,该时间复杂度是logn多项式,因而算法2-6是亚线性算法。■
引理2-4 如果“坏”索引的个数小于εn,则其存在一个长度大于εn的单调递增子序列。
证明 往证如果在数组中把坏索引去掉,那么剩下的序列一定是单调递增子序列。因为对于任意“好”索引i和j,xi定理2-8 如果输入数列是有序的,算法2-6返回true;如果输入的数组是ε-远离有序,算法2-6返回false的概率大于2/3。
证明 显然,输入数列有序,则每次二分搜索都得到正确的结果,故算法返回true。
根据引理2-4,如果输入ε-远离有序,则存在大于εn个“坏”元素,即数组的每个元素是“坏”元素的概率大于ε。此时,2/ε次挑选的元素都是好的概率小于(1-ε)2/ε

相关文章:

  • 给vs2015添加EF
  • 深夜食堂:加班码代码太烧脑_你最爱哪种加班美食?
  • PHP后台之调试手段(新手必备)
  • js php 数组比較
  • 西工大10级保研机试 柱状图
  • transform 实现响应式绝对居中
  • 需求调研与分析流程
  • InfoQ在ETE大会上对Android工程师Jake Wharton的采访
  • 自己动手做聊天机器人 一-涉及知识【转】
  • Linux下安装Nginx详细图解教程
  • 用到qsort的一道题(+qsort模板)
  • js中函数的参数注意事项
  • flume 简单实例
  • DirectX11 学习笔记10 - 用文件存储顶点布局
  • 深入浅出TensorFlow(六)TensorFlow高层封装
  • JavaScript 如何正确处理 Unicode 编码问题!
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • ECMAScript6(0):ES6简明参考手册
  • in typeof instanceof ===这些运算符有什么作用
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Spark RDD学习: aggregate函数
  • spring + angular 实现导出excel
  • 前端面试之CSS3新特性
  • 如何优雅地使用 Sublime Text
  • 我的zsh配置, 2019最新方案
  • 在Mac OS X上安装 Ruby运行环境
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​520就是要宠粉,你的心头书我买单
  • ​插件化DPI在商用WIFI中的价值
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #laravel 通过手动安装依赖PHPExcel#
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (一)kafka实战——kafka源码编译启动
  • (转)创业家杂志:UCWEB天使第一步
  • ******IT公司面试题汇总+优秀技术博客汇总
  • ***检测工具之RKHunter AIDE
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .Family_物联网
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .php文件都打不开,打不开php文件怎么办
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @RunWith注解作用
  • [2]十道算法题【Java实现】
  • [2018-01-08] Python强化周的第一天
  • [Android] 修改设备访问权限
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [Assignment] C++1