博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《大数据算法》一2.4 数组有序的判定算法
阅读量:6234 次
发布时间:2019-06-22

本文共 982 字,大约阅读时间需要 3 分钟。

本节书摘来华章计算机《大数据算法》一书中的第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
xj then //碰到了“坏”索引    return falsereturn 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/ε

转载地址:http://hzena.baihongyu.com/

你可能感兴趣的文章
架构设计知识梳理(2) Flux
查看>>
Android当内存监控到阈值时应该怎么办?
查看>>
阿里云宣布与国内规模最大的汽车企业上汽集团合作
查看>>
调试js碰到循环断点(debugger),应该怎么做?
查看>>
JB的测试之旅-网站的响应式与自适应
查看>>
图解 SQL 里的各种 JOIN
查看>>
2018 总结
查看>>
网页图标的优雅使用与总结
查看>>
iOS 录制视频时,添加水印
查看>>
工厂模式 抽象模式
查看>>
搞懂“分布式锁”,看这篇文章就对了
查看>>
1 序言 [全栈攻城师的技术札记]
查看>>
LeetCode之DI String Match(Kotlin)
查看>>
LeetCode之Two Sum IV Input is a BST(Kotlin)
查看>>
iOS 瀑布流之栅格布局
查看>>
Android中Activity的启动流程
查看>>
Parity钱包漏洞全分析及区块链安全风险应对措施
查看>>
到底是用"静态类"还是单例
查看>>
Redis RedLock 完美的分布式锁么?
查看>>
深入剖析Redis系列(八) - Redis数据结构之集合
查看>>