热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

“选择算法”

翻译自维基百科:http:en.wikipedia.orgwikiSelection_algorithm在计算机科学里,选择算法(sele

翻译自维基百科:http://en.wikipedia.org/wiki/Selection_algorithm

        在计算机科学里,选择算法(selection algorithm)是一种用于在一个列表中查找第K小的数的算法(这个数也被称之为第K个顺序统计量)。这类算法包括查找最小值、最大值和中值三类。这里有一些最坏时间复杂度为O(n)的选择算法。选择问题是更为复杂的问题,例如最近邻问题和最短路径问题的子问题。

        术语“选择”也被用在计算机科学界得其它上下文中。比如,遗传算法中的选择,是指从一代个体中选取的用于繁殖下一代个体的基因。本篇文章仅涉及如何确定顺序统计量的问题。

1、通过排序实现选择。

        选择问题可以通过对列表中的数据进行排序,然后提取需要的数值来简化为一个排序问题。当需要对列表中的数据进行排序时,该方法十分有效。在这种情况下,仅需要一个初始的、计算时间昂贵的排序算法和一些列后续的提取操作就可以完成目标。总的来说,这种方法的时间复杂度为O(n log n),这里的n指代列表的长度。

2、非线性的通用选择算法

   利用与求解最大、最小值相似的思想,我们可以实现一个简单,但是费时的用于在一个列表中查找第K小或第K大的数。这种方法的时间复杂度为O(kn),当K的值较小时很有效。为了实现该算法,我们仅需要简单的在列表中找出最小或最大值,并将它移动到列表的开头,知道我们得到想要的第K个数。这可以看做是一种选择排序,下面给出选择第K小的数的算法:

function select(list[1..n], k)for i from 1 to kminIndex = iminValue = list[i]for j from i+1 to nif list[j] return list[k] 该算法的其它一些优势在于:

&#xff08;1&#xff09;在定位到第j小的数后&#xff0c;便仅需要O(j &#43; (k-j)2)的时间来定位第K小的数&#xff0c;或者当k <&#61; j 时&#xff0c;仅需要O(k)的时间来提取第k小的数。

&#xff08;2&#xff09;该算法可以借助链表数据结构来实现。然而基于分割的方法则需要有直接存取的功能。

3、基于分割的通用选择算法

    一个在实际中很有效的通用的选择算法&#xff0c;但是在最坏情况下有较高时间复杂度的算法&#xff0c;是由快速排序的发明者C.A.R. Hoare构想出来的。该选择算法被称为Hoare&#39;s selection algorithm 或者被称为quickselect。

在快速排序算法中&#xff0c;有一个叫做分割的子过程&#xff0c;它能够在线性的时间内&#xff0c;将范围从left到right的列表分割为两个部分&#xff0c;即小于某一特定值的为一部分&#xff0c;大于等于某一特定值的为另一部分。下面的伪代码执行关于元素list[pivotIndex]的分割过程&#xff1a;

function partition(list, left, right, pivotIndex)pivotValue :&#61; list[pivotIndex]swap list[pivotIndex] and list[right] // Move pivot to endstoreIndex :&#61; leftfor i from left to rightif list[i] // Move pivot to its final placereturn storeIndex     在快速排序算法中&#xff0c;我们递归的对两个分支进行排序&#xff0c;获得了最好的
Ω(n log n) 的时间复杂度。但是在选择问题中&#xff0c;我们只需要知道想要的元素在哪一个分支里面&#xff0c;因为枢纽元素处于最终排序完成的位置时&#xff0c;位于它左边的元素是有序的&#xff0c;位于它右边的元素也是有序的。因此&#xff0c;只需要在正确的分支里进行一次递归调用就可以找到所需的元素了。

function select(list, left, right, k)if left &#61; right // If the list contains only one elementreturn list[left] // Return that elementselect pivotIndex between left and rightpivotNewIndex :&#61; partition(list, left, right, pivotIndex)pivotDist :&#61; pivotNewIndex - left &#43; 1 // The pivot is in its final sorted position, // so pivotDist reflects its 1-based position if list were sortedif pivotDist &#61; k return list[pivotNewIndex]else if k return select(list, left, pivotNewIndex - 1, k)elsereturn select(list, pivotNewIndex &#43; 1, right, k - pivotDist)

注意它与快速排序算法的相似之处&#xff1a;正如基于最小值的选择算法是一种部分选择算法一样&#xff0c;该方法是一种部分快速排序方法。相比于快速排序里O(n)的分割时间&#xff0c;这里仅需要O(logn)的时间。这个简单的算法有着线性的表现&#xff0c;正如快速排序一样&#xff0c;在实际应用中有着很好的表现。它同时也是一个in-place算法&#xff0c;仅需要常数级的内存开销&#xff0c;因为尾递归可以使用下面的方法来消除&#xff1a;

function select(list, left, right, k)loopselect pivotIndex between left and rightpivotNewIndex :&#61; partition(list, left, right, pivotIndex)pivotDist :&#61; pivotNewIndex - left &#43; 1if pivotDist &#61; kreturn list[pivotNewIndex]else if k elsek :&#61; k - pivotDistleft :&#61; pivotNewIndex &#43; 1 像快速排序算法一样&#xff0c;该算法对于枢纽元素
pivot的选择十分敏感。如果常常选择的是不好的枢纽元素&#xff0c;该算法将会退化到和之前所述的基于最小值的选择算法一样&#xff0c;
时间复杂度为
O(n2)。David Musser描述的“median-of-3 killer”序列能够使得著名的三数取中位数的枢纽元素选取方法失效。

4、线性通用选择算法--中位数的中位数算法

未完待续。。。




推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
Rianbow_小渊渊设
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有