查找算法

最后的性能优化策略[关闭]

大憨熊 提交于 2020-01-25 09:17:09
这个网站上已经有很多性能问题,但我发现几乎所有问题都是针对特定问题而且相当狭窄。 几乎所有人都重复这些建议,以避免过早优化。 我们假设: 代码已经正常工作 所选择的算法对于问题的情况已经是最佳的 已经测量了代码,并且已经隔离了违规的例程 所有优化尝试也将被测量,以确保它们不会使事情变得更糟 我在这里寻找的是在一个关键算法中挤出最后几个百分点的策略和技巧,除此之外别无他法。 理想情况下,尝试使答案语言不可知,并在适用的情况下指出建议策略的任何缺点。 我将使用我自己的初步建议添加回复,并期待Stack Overflow社区可以想到的任何其他内容。 #1楼 我花了一些时间来优化在低带宽和长延迟网络(例如卫星,远程,离岸)上运行的客户端/服务器业务系统,并且能够通过相当可重复的过程实现一些显着的性能改进。 措施 :首先了解网络的基础容量和拓扑。 与业务中的相关网络人员交谈,并利用ping和traceroute等基本工具在典型的运营期间(至少)建立每个客户端位置的网络延迟。 接下来,对显示有问题症状的特定最终用户功能进行准确的时间测量。 记录所有这些测量值,以及它们的位置,日期和时间。 考虑在客户端应用程序中构建最终用户“网络性能测试”功能,允许高级用户参与改进过程; 当你处理因表现不佳的系统而感到沮丧的用户时,像这样赋予他们权力可能会产生 巨大的 心理影响。 分析

Java中常用的4种查找算法详解

梦想的初衷 提交于 2020-01-25 07:53:19
4种常用的查找算法 顺序(线性)查找 二分查找/折半查找 插值查找 斐波那契查找 1.顺序(线性)查找 逐一比对,发现相同值时返回下标 package com . data . struct . search . lineSearch ; /** * @author Creepin * @date 2019/12/5 13:04 * @description 线性查找:逐一比对,发现相同值时返回下标 */ public class LineSearch { public static void main ( String [ ] args ) { int arr [ ] = { 1 , 2 , 4 , 5 , 6 , 7 , 8 } ; int index = lineSearch ( arr , 2 ) ; if ( index == - 1 ) { System . out . println ( "没找到指定元素" ) ; } else { System . out . println ( "找到指定元素下标为:" + index ) ; } } private static int lineSearch ( int [ ] arr , int value ) { for ( int i = 0 ; i < arr . length ; i ++ ) { if ( arr [

动画 | 什么是红黑树?(与2-3-4树等价)

混江龙づ霸主 提交于 2020-01-24 19:50:44
二分搜索树是为了快速查找而生,它是一颗二叉树,每一个节点只有一个元素(值或键值对),左子树所有节点的值均小于父节点的值,右子树所有的值均大于父节点的值,左右子树也是一颗二分搜索树,而且没有键值相等的节点。它的查找、插入和删除的时间复杂度都与树高成比例,期望值是O(log n)。 但是插入数组如[],二分搜索树的缺点就暴露出来了,二分搜索树退化成线性表,查找的时间复杂度达到最坏时间复杂度O(n)。 动画:二分搜索树退化成线性表 那有没有插入和删除操作都能保持树的完美平衡性(任何一个节点到其叶子节点的路径长度都是相等的)? 有,B树。B树是一种自平衡的树,根节点到其叶子节点的路径高度都是一样的,能够保持数据有序(通过中序遍历能得到有序数据)。B树一个节点可以拥有2个以上的子树,如2-3树、2-3-4树甚至2-3-4-5-6-7-8树,它们满足二分搜索树的性质,但它们不属于二叉树,也不属于二分搜索树。 2-3-4树的完美平衡,每条从根节点到叶子节点的路径的高度都是一样的 2-3-4树有以下节点组成: 2-节点,含有一个元素(值或键值对)和两个子树(左右子树),左子树所有的值均小于父节点的值,右子树所有的值均大于父节点的值; 3-节点,含有两个元素和三个子树,左子树所有的值均小于父节点最小元素的值,中间子树所有的值均位于父节点两个元素之间,右子树所有的值均大于父节点最大元素的值; 4-节点

第二十一次-查找(二)

眉间皱痕 提交于 2020-01-24 01:33:32
折半查找 适用条件: Ø 线性表中的记录必须按关键码有序; Ø 必须采用顺序存储。 基本思想: 在有序表中(low, high,low<=high), 取中间记录作为比较对象, 若给定值与中间记录的关键码相等,则查找成功; 若给定值小于中间记录的关键码,则在中间记录的左半区继续查找; 若给定值大于中间记录的关键码,则在中间记录的右半区继续查找。 不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。 int LineSearch :: BinSearch1(int k){ int mid, low = 1, high = length; //初始查找区间是[1, n] while (low <= high) {//当区间存在时 mid = (low + high) / 2; if (k < data[mid]) high = mid - 1; else if (k > data[mid]) low = mid + 1; else return mid; //查找成功,返回元素序号 } return 0; //查找失败,返回0 } int LineSearch :: BinSearch2(int low, int high, int k){ if (low > high) return 0; //递归的边界条件 else { int mid = (low + high) /

C基础算法之二分法查找

僤鯓⒐⒋嵵緔 提交于 2020-01-23 22:48:44
算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。 基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段 中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。 二分法查找在针对大量有序排列的情况下发挥出很优越的效率,这里以最具规律性的数组为例,代码如下: 示例代码: /* binarysearch2.c --- * * Filename: binarysearch2.c * Description: 用循环方式和递归两种方式 实现二分法查找过程 * Author: magc * Maintainer: * Created: 三 7月 25 23:26:52 2012 (+0800) * Version: * Last-Updated: 四 7月 26 00:22:37 2012 (+0800) * By: magc * Update #: 74 * URL: * Keywords: 递归 二分法查找 * Compatibility: * */ /* Commentary: * * * */ /* Change Log: * 添加循环方式和递归方式 * */ /* Code: */ #include <assert.h> #include <ctype.h>

动画 | 什么是红黑树?(与2-3-4树等价)

走远了吗. 提交于 2020-01-23 13:40:58
二分搜索树是为了快速查找而生,它是一颗二叉树,每一个节点只有一个元素(值或键值对),左子树所有节点的值均小于父节点的值,右子树所有的值均大于父节点的值,左右子树也是一颗二分搜索树,而且没有键值相等的节点。它的查找、插入和删除的时间复杂度都与树高成比例,期望值是O(log n)。 但是插入数组如[],二分搜索树的缺点就暴露出来了,二分搜索树退化成线性表,查找的时间复杂度达到最坏时间复杂度O(n)。 动画:二分搜索树退化成线性表 那有没有插入和删除操作都能保持树的完美平衡性(任何一个节点到其叶子节点的路径长度都是相等的)? 有,B树。B树是一种自平衡的树,根节点到其叶子节点的路径高度都是一样的,能够保持数据有序(通过中序遍历能得到有序数据)。B树一个节点可以拥有2个以上的子树,如2-3树、2-3-4树甚至2-3-4-5-6-7-8树,它们满足二分搜索树的性质,但它们不属于二叉树,也不属于二分搜索树。 2-3-4树的完美平衡,每条从根节点到叶子节点的路径的高度都是一样的 2-3-4树有以下节点组成: 2-节点,含有一个元素(值或键值对)和两个子树(左右子树),左子树所有的值均小于父节点的值,右子树所有的值均大于父节点的值; 3-节点,含有两个元素和三个子树,左子树所有的值均小于父节点最小元素的值,中间子树所有的值均位于父节点两个元素之间,右子树所有的值均大于父节点最大元素的值; 4-节点

二分法查找

≯℡__Kan透↙ 提交于 2020-01-23 00:24:15
一、简介 二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。 二分法查找的思路如下: (1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。 (2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。 (3)如果某一步数组为空,则表示找不到目标元素。 二分法查找的时间复杂度O(logn),优于常规O(n)时间复杂度的算法。 是程序员必须掌握的基础算法之一,在笔试面试中较高频率考察。 二、无重复查找算法 如果数组元素是不重复的(已排序),那么只有一个查找目标。 int binarySearchSingle(vector<int>& array, int target) { int left = 0, right = array.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (array[mid] == target) return mid; else if (array[mid] < target) left = mid + 1; else right = mid - 1; } return -1; } 三、有重复查找算法 如果数组元素是不重复的(已排序)

数据结构与算法----->数据结构----->堆

♀尐吖头ヾ 提交于 2020-01-22 04:18:25
13.1 堆的概念 堆是一种二叉树,是一种特殊的二叉树 节点的子节点的关键字 13.2 java程序实现堆这种数据结构 13.2.1编程思路:   step1,首先了解堆的概念 堆是完全二叉树 使用数组来存储堆元素,熟记数组元素下标和子节点、父节点的关系 如果堆中某个节点的数组下标为x,那么    熟记“”堆条件“”           step2,依据堆的概念,设计class Heap中成员函数—— fun:删除堆中关键值最大的节点 编程思路         java代码      step3,依据堆的概念,设计class Heap中的成员函数—— fun:往现有的堆中插入一个新的节点 编程思路: 向上筛选,使得新插入的节点关键值小于父节点关键值,大于子节点关键值,使得新的二叉树重新满足“”堆条件“” 只需要将新节点关键值和其“”暂时位置“”上的父节点的关键值相比较,并根据需要交换位置即可    java代码: trickleUp(int index)函数将新节点向上筛选使得重新满足堆条件,该函数的参数是节点在存储堆元素的数组中的位置下标 应注意上述程序中插入的一个新的节点之后,数组大小currentSize++           step4,依据堆的概念,设计class Heap中的成员函数—— fun:改变的堆中某个节点的值 编程思路: 如果该节点的关键值降低了

算法:二维数组中的查找

帅比萌擦擦* 提交于 2020-01-21 21:55:17
题目 :在一个二维数组中 每一行都按照从左到右递增的顺序排序 每一列都按照从上到下递增的顺序排序 请完成一个函数,输入这样的一个二维数组 和一个整数,判断数组中是否含有该整数*** 思路 首先选取数组中右上角的数字 如果该数等于要查找的数字 则查找结果结束 * 如果该数组大于查找的数字,则剔除这个数组所在的列 * 如果该数字小于要查找的数字 则踢除这个数字所在的行 * 也就是说 如果要查找的数字不在数组的右上角 则每一次都在数组的查找范围中剔除一行或者一类 * 这样每一步都可以缩小查找的范围 知道找到要查找的数字 或者查找范围为空 代码: public class Test { /* * 解法: * 首先选取数组中右上角的数字 如果该数等于要查找的数字 则查找结果结束 * 如果该数组大于查找的数字,则剔除这个数组所在的列 * 如果该数字小于要查找的数字 则踢除这个数字所在的行 * 也就是说 如果要查找的数字不在数组的右上角 则每一次都在数组的查找范围中剔除一行或者一类 * 这样每一步都可以缩小查找的范围 知道找到要查找的数字 或者查找范围为空 */ public boolean checkSort(int[][] a,int rows,int columns,int number){ if(a != null && a.length>=0){ int row = 0; int

平衡二叉树

我们两清 提交于 2020-01-21 08:49:23
一步一步写平衡二叉树(AVL树) 转载: http://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html   平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树。1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵树,所以它又叫AVL树。平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果插入或者删除一个节点使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。   平衡二叉树实现的大部分过程和二叉查找树是一样的(学平衡二叉树之前一定要会二叉查找树),区别就在于插入和删除之后要写一个旋转算法去维持平衡,维持平衡需要借助一个节点高度的属性。我参考了机械工业出版社的《数据结构与算法分析-C语言描述》写了一个C++版的代码。这本书的AVLTree讲的很好,不过没有很完整的去描述。我会一步一步的讲解如何写平衡二叉树,重点是平衡二叉树的核心部分,也就是旋转算法。 第一步:节点信息