时间复杂度-线性对数时间nlogn的一些研究

2023-11-03

排序算法的时间复杂度

时间复杂度的本质就是一个函数f(x)=y,其中y是时间,x是被操作的元素数量,分析的是随着x元素的增加,计算机所需计算时间y的变化。时间复杂度的写法是 O ( x ) O(x) O(x),x是元素数量,O返回的是时间,时间复杂度不会追求计算机完成该算法的精确时间,也没办法计算,例如计算机对于不同的数据类型例如float或int所需的计算时间肯定是不同的,所以O()只是对一种xy线性关系粗糙的描述。

绝大部分的排序算法的平均时间复杂度就是两种,慢的 O ( n 2 ) O(n^2) O(n2)或是快的 O ( n ∗ l o g 2 n ) O(n*log_2^n) O(nlog2n) O ( n 2 ) O(n^2) O(n2)数学的名字叫quadratic time平方时间 ,从代码的角度看就是两个for循环,比如说 n = 5 2 = 25 n=5^2=25 n=52=25,那么两个五次for循环正好是25次循环,下面要研究的是 O ( n ∗ l o g 2 n ) O(n*log_2^n) O(nlog2n),linearithmic time线性对数时间。

二叉树与 n l o g 2 n nlog_2^n nlog2n

假设n为一个2的倍数,它可以以二叉树的形式不断向下二分,设这个树的深度为k,可以看出每一层的节点内的数的和都是n,那么整个树所有节点的合为n*k
在这里插入图片描述
[图1]
从上图中可以看出每个节点内的数量还可以用 1 2 a ∗ n \frac{1}{2^a}*n 2a1n来表示,观察最底层可得出:
1 = 1 2 k − 1 ∗ n 1=\frac{1}{2^{k-1}}*n 1=2k11n
既是
2 k − 1 = n 2^{k-1}=n 2k1=n
根据对数公式:
k − 1 = l o g 2 n k-1=log_{2}^{n} k1=log2n
k = l o g 2 n + 1 k=log_{2}^{n}+1 k=log2n+1
已知 s u m = n ∗ k sum=n*k sum=nk所以:
s u m = n ∗ ( l o g 2 n + 1 ) = n l o g 2 n + n sum=n*(log_{2}^{n}+1)=nlog_{2}^{n}+n sum=n(log2n+1)=nlog2n+n
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,当用二分法进行问题分解时,这里 n l o g 2 n nlog_{2}^{n} nlog2n可以代表在最完美的二分情况下的各个子问题的和。代入进 O ( n l o g 2 n + n ) O(nlog_{2}^{n}+n) O(nlog2n+n),最后的n按O()约定可以当常数约掉(另外很多算法里当问题的规模只有1时计算就已经结束了, O ( n l o g 2 n ) O(nlog_{2}^{n}) O(nlog2n)反而更加精准)。下面分析一个具体的nlogn算法。

快速排序的大致复杂度分析

本文分析的案例是快速排序,快排根据如何对数组进行划分再次递归有一些不同的版本,在一些case上的复杂度会有些区别,以下是称为Hoare分区法的C#版本
C#代码:

    void Quicksort(int[] arr, int low, int high)
    {
        if (low < high)
        {
            int pivot = arr[(low + high) / 2];
            int left = low - 1;
            int right = high + 1;

            while (true)
            {
                do
                {
                    left++;
                } while (arr[left] < pivot);

                do
                {
                    right--;
                } while (arr[right] > pivot);

                if (left >= right)
                {
                    pivot = right;
                    break;
                }
                //交换
                int leftCopy = arr[left];
                arr[left] = arr[right];
                arr[right] = leftCopy;
            }
            Quicksort(arr, low, pivot);
            Quicksort(arr, pivot + 1, high);
        }
    }

参数arr是被处理的数组,low是0,high是arr.length-1,从代码可以看出只要输入元素大于两个,那么Quicksort就会进行递归,Sort函数返回的pi可以看做是一个锚点,它将arr划分为两个部分,交给Quicksort分别处理,如果将Sort的递归调用画为一个二叉树,pi就决定了二叉树的分叉情况
在这里插入图片描述
(图1:将Sort递归调用次数画为二叉树)

上图假设arr的长度为10,每个节点代表一次Quicksort调用,节点内数字代表当前函数调用需要处理的数组元素数量,当元素等于1时不会调用。上文已经分析越是完美二分的二叉树,它的深度越接近logn+1,由于这里把1的叶子节点删除了,所以这里的深度k变为了logn。左面的二叉树高度非常接近 l o g 2 10 = 3.32 log_2^{10}=3.32 log210=3.32。从上图可以看出越是一个平衡的二叉树它需要处理的元素越少,右边那种极端非平衡的树需要处理的元素总数是最多的。但是该算法的复杂度不只和Quicksort函数的调用次数有关,更主要的是函数内部的操作数量,实际的复杂度还要具体分析。但是上图还是可以反映出一个一般趋势,既是良好平衡的划分有助于降低复杂度。

进一步的复杂度分析

最坏情况worst case

Quicksort函数最主要的操作是数组遍历与数组交换,left与right从arr数组两边向中央移动遍历直到相交,在移动过程中如果发现有需要交换的数就进行交换,当left与right相交后则返回right作为pi锚点将数组一分为二进行递归。

每次数组元素交换行为都会导致right向左移动一位,如果说图1右方的二叉树是最坏情况,那么对于1个长度为10的arr,它的具体行为就是:
left左移10次
right右移1次
交换1次
交换有三行代码,总操作次数为10+1+3=14。
但是考虑一个10个相同数的数组:
left左移5
right右移6次
交换5次
5+6+5*3=26次操作。由于等值数组的二分是完全平衡的,n的大小与交换次数成等比例关系,在n>100时,全等数组就是该算法的worst case。(实测当n不是很大的时候,有些特殊形式的数组操作数量会超过全等值数组例如aaaabaaaab,a<b)。
在这里插入图片描述
(图2:Quciksort处理等值数组时的具体行为)
在这里插入图片描述
(图3:Quciksort处理等值数组时的具体行为)
在这里插入图片描述
(图4:Quciksort处理等值数组时的具体行为)

最佳情况best case

从上文已知交换次数会导致复杂度上升,平衡二分会导致复杂度下降。那么一个不需要交换的平衡二叉树既是best case。它就是一个已经排好序的数组,例如1,2,3,4,5,6,7,8,9,10。不需要任何交换并且每次都是在中央二分。

用表达式计算更加精确的复杂度

分析

首先要更加仔细的剖析代码,给各个操作划分case计数。
Unity测试脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class QuickSortBlog : MonoBehaviour {
    //计数器
    struct counter
    {
        public int operations;   //操作计数
        public int qsCalls;      //Quicksort方法调用次数
        public int qsValidCalls; //有效的Quicksort方法调用次数(操作数大于2)
        public int swapCount;    //交换次数
        public int moveCount;    //移动次数
    };

    counter c;
    counter randomMaxC;
    int[] randomMaxArr;

	// Use this for initialization
	void Start () {
        c=new counter();
        c.operations = 0;
        c.qsCalls = 0;
        c.qsValidCalls = 0;
        c.swapCount = 0;
        c.moveCount = 0;
        int[] arr = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        Quicksort(arr, 0, 9);
        Debug.Log("successive numbers,operations:" + c.operations + ",qsCalls:" + c.qsCalls + ",qsValidCalls:" + c.qsValidCalls + ",swapCount:" + c.swapCount+",moveCount:"+c.moveCount);

        c.operations = 0;
        c.qsCalls = 0;
        c.qsValidCalls = 0;
        c.swapCount = 0;
        c.moveCount = 0;
        arr = new int[10] { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8};
        Quicksort(arr, 0, 9);
        Debug.Log("same numbers,operations:" + c.operations + ",qsCalls:" + c.qsCalls + ",qsValidCalls:" + c.qsValidCalls + ",swapCount:" + c.swapCount + ",moveCount:" + c.moveCount);

        /*Quicksort处理aaaabaaaab形式数组有更差的性能表现
        c.total = 0;
        c.qsCall = 0;
        c.validQSCall = 0;
        c.swapCall = 0;
        c.move = 0;
        temp = new int[10] { 6,6,6,6,8,6,6,6,6,8 };
        Quicksort(temp, 0, 9);
        Debug.Log("aaaabaaaab,numbers:" + c.operations + ",qsCalls:" + c.qsCalls + ",qsValidCalls:" + c.qsValidCalls + ",swapCount:" + c.swapCount + ",moveCount:" + c.moveCount);
        */

        //10000次随机测试
        randomMaxC = new counter();
        randomMaxC.operations = 0;
        randomMaxC.qsCalls = 0;
        randomMaxC.qsValidCalls = 0;
        randomMaxC.swapCount = 0;
        randomMaxC.moveCount = 0;
        for (int i = 0; i < 100000;i++){
            RandomDebug();
        }
        Debug.Log("random numbers,operations:" + randomMaxC.operations + ",qsCalls:" + randomMaxC.qsCalls + ",qsValidCalls:" + randomMaxC.qsValidCalls + ",swapCount:" + randomMaxC.swapCount+ ",moveCount:" + randomMaxC.moveCount);
        for (int i = 0; i < 10; i++)
        {
            Debug.Log(randomMaxArr[i].ToString());
        }
    }
    //随机数组生成与测试
    void RandomDebug(){
        c.operations = 0;
        c.qsCalls = 0;
        c.qsValidCalls = 0;
        c.swapCount = 0;
        c.moveCount = 0;
        int[] debugArray = new int[10];
        int[] copyArray = new int[10];
        for (int i = 0; i < 10;i++){
            debugArray[i] = Random.Range(1, 11);
            copyArray[i] = debugArray[i];
        }
        Quicksort(debugArray, 0, 9);
        SelectRandomMax(copyArray);
    }
    //worst case筛选
    void SelectRandomMax(int[] arr){
        if(c.operations>randomMaxC.operations){
            randomMaxArr = arr;

            randomMaxC.operations = c.operations;
            randomMaxC.qsCalls = c.qsCalls;
            randomMaxC.qsValidCalls = c.qsValidCalls;
            randomMaxC.swapCount = c.swapCount;
            randomMaxC.moveCount = c.moveCount;
        }
    }

    void Quicksort(int[] arr, int low, int high)
    {
        c.qsCalls++;
        c.operations++;
        if (low < high)
        {
            c.qsValidCalls++;
            int pivot = arr[(low + high) / 2];
            int left = low - 1;
            int right = high + 1;
            c.operations+=3;

            while (true)
            {
                do
                {
                    left++;
                    c.operations++;
                    c.moveCount++;
                } while (arr[left] < pivot);

                do
                {
                    right--;
                    c.operations++;
                    c.moveCount++;
                } while (arr[right] > pivot);

                if (left >= right)
                {
                    pivot = right;
                    c.operations += 2;
                    break;
                }
                c.swapCount++;
                c.operations++;
                //交换
                int leftCopy = arr[left];
                arr[left] = arr[right];
                arr[right] = leftCopy;
                c.operations+=3;
            }
            Quicksort(arr, low, pivot);
            Quicksort(arr, pivot + 1, high);
            c.operations+=2;
        }
    }
}

结合上面代码与图1可以归纳出以下几点,当arr长度为n时:
worst case最差情况:
1,有效调用(arr长度大于2)Quicksort方法n-1次。每次调用与之相关的操作有8次。
2,无效调用Quicksort方法n次。每次调用与之相关的操作有1次。
3,问题分治的二叉树高度基本等于logn。
4,在二叉树每一层,数组元素交换相关操作次数根据奇偶数case平均后等于n+1.5。
5,在二叉树每一层,数组遍历相关操作次数根据奇偶数case平均后等于(n/2+0.25)*4。

best case最佳情况:
1,2,3,5同上。第4条数组元素交换次数为0。

结合以上情况可得出表达式:
worst case:
f ( n ) = ( n − 1 ) ∗ 8 + n + l o g 2 n ∗ ( ( n 2 + 0.25 ) ∗ 4 + ( n + 1.5 ) ) f(n)=(n-1)*8+n+log_2^n*((\frac{n}{2}+0.25)*4+(n+1.5)) f(n)=(n1)8+n+log2n((2n+0.25)4+(n+1.5))
best case:
f ( n ) = ( n − 1 ) ∗ 8 + n + l o g 2 n ∗ ( n + 1.5 ) f(n)=(n-1)*8+n+log_2^n*(n+1.5) f(n)=(n1)8+n+log2n(n+1.5)

测试

1,n=10
最佳情况,连续数字
Unity脚本:operations=125
表达式计算结果:f(n)=120.2

最差情况,相同数字
Unity脚本:operations=190
表达式计算结果:f(n)=189.96

2,n=100
最佳情况,连续数字
Unity脚本:operations=1663
表达式计算结果:f(n)=1566.35

最差情况,相同数字
Unity脚本:operations=2986
表达式计算结果:f(n)=2901.7

3,n=1000
最佳情况,连续数字
Unity脚本:operations=19967
表达式计算结果:f(n)=18972.3

最差情况,相同数字
Unity脚本:operations=40582
表达式计算结果:f(n)=38914.27

表达式计算出的值与真实数字还是有一些误差,主要是二叉树深度那块的处理方案还是有问题。

图像

有了表达式就可以画图了。红线是 O ( n 2 ) O(n^2) O(n2),蓝线是 O ( n l o g n ) O(nlogn) O(nlogn),灰色区域是best case和worst case表达式的积分面积,该算法所有case的复杂度都在这范围内
在这里插入图片描述
(图5:n<100)
在这里插入图片描述
(图5:n<1000)
在这里插入图片描述
(图5:n<50000)


参考:
Quicksort–hoare partition scheme:https://en.wikipedia.org/wiki/Quicksort#Hoare_partition_scheme
时间复杂度 O(log n) 意味着什么?:https://juejin.im/entry/593f56528d6d810058a355f4
A Gentle Introduction to Algorithm Complexity Analysis: https://discrete.gr/complexity/


维护日志:
2020-2-5:修改整理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

时间复杂度-线性对数时间nlogn的一些研究 的相关文章

  • 如何计算归并排序算法的时间复杂度?

    如何计算归并排序算法的时间复杂度 什么是归并排序 计算时间复杂度 什么是归并排序 归并排序的概念十分简单 就是 分而治之 的思想 这里我直接从网上找了一份对归并排序算法的比较好的介绍排序算法 计算时间复杂度 关键是怎么计算时间复杂度 我们在
  • 深入理解js数组自定义排序sort

    定义和用法 sort 方法用于对数组的元素进行排序 语法 arrayObject sort function nextValue currentValue code 案例 var arr 5 4 3 2 1 6 7 8 9 倒序 arr s
  • 十大排序算法:快速排序算法

    一 快速排序算法思想或步骤 分解 数组A p r 被划分为两个子数组A p q 1 和A q 1 r 使得A q 为大小居中的数 左侧A p q 1 中的每个元素都小于等于它 而右边A q 1 r 每个元素都大于等于它 解决 通过递归调用快
  • 常见的排序算法总结

    排序简介 简介 排序算法 英语 Sorting algorithm 是一种将一组特定的数据按某种顺序进行排列的算法 排序算法多种多样 性质也大多不同 性质 稳定性 稳定性是指相等的元素经过排序之后相对顺序是否发生了改变 拥有稳定性这一特性的
  • 时间复杂度-线性对数时间nlogn的一些研究

    文章目录 排序算法的时间复杂度 二叉树与 n l o g 2 n
  • 剑指 Offer 40. 最小的 k 个数

    系列文章目录 文章目录 系列文章目录 前言 一 剑指 Offer 40 最小的 k 个数 二 使用步骤 1 引入库 解法一 暴力破解法 冒泡排序 可惜超过时间限制 解法二 快速排序法 方法三 基于快速排序的数组划分 总结 前言 一 剑指 O
  • PAT Basic Level 1045 快速排序(思维)

    题目链接 点击查看 题目描述 著名的快速排序算法里有一个经典的划分过程 我们通常采用某种方法取一个元素作为主元 通过交换 把比主元小的元素放到它的左边 比主元大的元素放到它的右边 给定划分后的 N 个互不相同的正整数的排列 请问有多少个元素
  • java实现快速排序(图)

    快速排序 快速排序是对冒泡排序的一种改进 它是不稳定的 由C A R Hoare在1962年提出的一种划分交换排序 采用的是分治策略 一般与递归结合使用 以减少排序过程中的比较次数 它的最好情况为O nlogn 最坏情况为O n 2 平均时
  • CH8-排序

    文章目录 1 基本概念和排序方法概述 1 1 排序方法的分类 1 2 存储结构 顺序表 2 插入排序 2 1 插入排序的种类 直接插入 折半插入 希尔排序 3 交换排序 3 1 冒泡排序 3 2 快速排序 4 选择排序 4 1 直接排序 4
  • top-K 算法总结

    问题描述 有 N N gt 1000000 个数 求出其中的前K个最小的数 又被称作topK问题 1 最基本思路 将N个数进行完全排序 从中选出排在前K的元素即为所求 有了这个思路 我们可以选择相应的排序算法进行处理 目前来看快速排序 堆排
  • 数组排序的方法?

    1 sort排序 let arr 1 2 3 4 5 6 7 8 9 0 9 8 7 6 3 4 5 5 var res console log arr 排序前 1 2 3 4 5 6 7 8 9 0 9 8 7 6 3 4 5 5 arr
  • C语言快速排序,以及注意点。

    快速排序尤其适用于对大数据的排序 它的高速和高效无愧于 快速 两个字 虽然说它是 最常用 的 可对于初学者而言 用它的人却非常少 因为虽然很快 但它也是逻辑最复杂 最难理解的算法 因为快速排序要用到递归和函数调用 快速排序所采用的思想是分治
  • 十大经典排序算法最强总结

    点击上方 我要学编程 选择 置顶 星标公众号 福利干货 第一时间送达 排序算法属于经典基础算法基本功 笔试面试基本都会涉及和考察的 有原题也有变化 不过基础的几大排序算法还是得尽可能熟悉 能在思路熟悉的前提下手写出代码就更好了 为了防止不提
  • 迭代和递归的时间复杂度分析

    文章目录 1 迭代 1 1 常数阶 1 2 线性阶 1 3 对数阶 1 4 平方阶 1 5 多个复杂度的顺序组合 1 6 多个复杂度的选择组合 2 递归 3 习题 4 答案 1 迭代 1 1 常数阶 下面算法的时间复杂度为 O 1 O 1
  • 《数据结构》--内部排序算法比较

    题目 各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶 或大概执行时间 试通过随机的数据比较各算法的关键字比较次数和关键字移动次数 以取得直观感受 基本要求 1 从以下常用的内部排序算法至少选取5种进行比较 直接插入排序 折半折
  • python 快速排序的实现

    快速排序 快速排序 Quicksort 是对冒泡排序的一种改进 快速排序算法通过多次比较和交换来实现排序 其排序流程如下 首先设定一个分界值 通过该分界值将数组分成左右两部分 将大于或等于分界值的数据集中到数组右边 小于分界值的数据集中到数
  • 数据结构与算法之美

    当我们要去做一件事的时候 必须要问自己三个问题 是什么 什么是数据结构与算法 数据结构 就是一组数组的存储结构 算法 就是操作数据的一组方法 数据结构是为算法服务的 算法要作用于特定的数据结构之上 为什么需要数据结构与算法 来谈谈应用层面的
  • 【C语言】快速排序函数qsort()

    快速排序函数 函数原型 各种数据类型的升序排序函数 1 整型 2 double型 3 字符排序 4 字符串排序 1 根据字符串首字母排序 2 根据字符串长度排序 3 按字典排序字符串 5 结构体 1 一级排序 2 二级排序 具体样例 1 整
  • 【模板】快速排序

    题目链接 洛谷 P1177 模板 快速排序 1960年由查尔斯 安东尼 理查德 霍尔 Charles Antony Richard Hoare 缩写为C A R Hoare 提出 如下图所示 快速排序的执行流程为 从序列中选择一个轴点元素
  • 数据结构算法-快速排序

    核心思路 快速排序算法核心思路 选择一个 基准 元素 将数组分为两个子数组 一个包含比基准小的元素 另一个包含比基准大的元素 然后对这两个子数组进行递归排序 基准数 初始化两个索引 i 和 j 分别子数组的开头和结尾 初始化基准元素 bas

随机推荐

  • Inferior 1 (process xxx) exited with code 0177

    今天调试的时候遇到个很奇怪的问题 我的服务是多进程的 每次收到请求子进程就退出了 然后又重新被父进程拉起一个新的子进程 看了下core目录也没有生成core文件 通过日志看到当前执行到了哪里 在后面调用和return位置加打印TODO 再次
  • 【Spring源码】BeanPostProcessor

    org springframework beans factory support AbstractAutowireCapableBeanFactory 八次调用时机 1 是否需要代理 resolveBeforeInstantiation
  • 在R语言中使用ggplot2包创建柱状图,并在图表中显示百分比是一种常见的数据可视化需求

    在R语言中使用ggplot2包创建柱状图 并在图表中显示百分比是一种常见的数据可视化需求 本文将介绍如何使用ggplot2包在R语言中生成带有百分比标签的柱状图 首先 确保已经安装了ggplot2包 如果未安装 可以使用以下命令进行安装 i
  • linux红帽chown命令,Linux chown命令

    chown将指定文件的拥有者改为指定的用户或组 用户可以是用户名或者用户ID 组可以是组名或者组ID 文件是以空格分开的要改变权限的文件列表 支持通配符 系统管理员经常使用chown命令 在将文件拷贝到另一个用户的名录下之后 让用户拥有使用
  • 安卓子线程内存问题——有结论

    问题描述 有一套C 库 通过JNI被安卓应用调用 应用中在主线程 UI现场 调用一函数正常 在子线程中调用该函数会导致APP崩溃 APP崩溃时报错信息如下 E libsigchain exiting due to SIG DFL handl
  • eBay架构的思想金矿

    2008年01月24日 星期四 11 53 P M 英文来源 http www manageability org blog stuff about ebays architecture An accurate way of knowing
  • 数组对象根据id字段去重

    数组对象根据id字段去重
  • iOS App 上架流程图文教学

    引言 在上架App 之前必须先准备好开发者帐号 但申请开发者帐号因法兰克早在之前已经申请好了 故就跳过此步骤 直接从产生凭证到上传App开始讲起 首先 要将自己辛苦写好的App 送审的话 则要依序做完下列几件事情即可 在开发者后台产生 ce
  • Go 语言中 = 和 := 有什么区别

    是赋值 是声明变量并赋值 使用必须使用先var声明例如 var a a 100 或 var b 100 或 var c int 100 是声明并赋值 并且系统自动推断类型 不需要var关键字 d 100
  • 编写一个"banner"函数,该函数的输入为大写字母

    编写一个 banner 函数 该函数的输入为大写字母 题目 编写一个 banner 函数 该函数的输入为大写字母 输出为一个字符数组 该数组以图像化的方式表示该字母 编程 珠玑 上提到当要 输入 的 数据 很多 且没有 规律 时 可以 考虑
  • 什么是代理?Java 中如何使用代理

    什么是代理 Java 中如何使用代理 什么是代理 代理是一种设计模式 它允许一个对象 代理对象 代表另一个对象 真实对象 进行一些操作 代理对象和真实对象有着相同的接口 因此代理对象可以替代真实对象的位置 而不会对客户端代码产生影响 代理对
  • 使用nginx作为HTTPS正向代理服务器(七层透传代理、中间人代理)

    前言 在讲解nginx正向代理https之前 我们先来解答几个小疑问 1 nginx是什么 Java同学肯定知道apache服务器 一个很牛 但是也很庞大的web服务器 能当web服务器的不仅仅只有apache 还有一个小巧轻快 高性能的家
  • Angular: Program ng failed to run No application is associated

    今天 搭建 Angular CLI 框架的时候 遇见了一个奇怪的问题 当我将 Angular CLI 搭建完成以后 我在 Windows PowerShell 和命令提示符上输入 ng 命令是工作正常的 但在 VSCode PowerShe
  • 区块链:Solidity值类型(Solidity 字典/映射 Mappings)

    语法 mapping KeyType gt ValueType 字典 映射其实就是一个一对一键值存储关系 age 28 height 172 name wt 同一个映射中 可以有多个相同的值 但是键必须具备唯一性 pragma solidi
  • 统计学基础

    数理统计简介 统计推断的三大问题 1 抽样分布 精确的与近似的 2 参数估计 点估计与区间估计 3 假设检验 1 1数理统计中的基本概念 总体与个体 在一个统计问题的研究中 我们把研究对象的全体构成的集合称为总体 集合中的每一个对象 元素
  • Android基础笔记:(2)四大组件 Service 详解【更新结束】

    目录 一 Service简介 二 Service分类 1 Started Service 2 Bound Service 3 启动Service回调的方法 4 通过代码还原Service生命周期 三 使用IntentService 1 为什
  • 【算法】常用的排序方法

    这里总结了几种排序方法 直接有函数可以调用 sort头函数 sort H ifndef SORT H define SORT H void InsertSort int arry int n void DubbleSort int arry
  • JAVA中的抽象类和接口应用_java编程中抽象类与接口的区别和应用场景

    随着互联网的不断发展 越来越多的程序员都开始学习java编程语言 而进我们就一起来了解一下 java编程中抽象类与接口的区别和应用场景 一 抽象类 抽象类体现了数据抽象的思想 不然呢 是实现多态的一种机制 抽象类定义了一组抽象的方法 至于这
  • 论文阅读 - Large-scale weakly-supervised pre-training for video action recognition

    文章目录 1 概述 2 数据的收集方式 3 使用的模型 4 预训练时的一系列问题 4 1 预训练的数据是不是越多越好 4 2 用于预训练的模型是不是越大越好 4 3 预训练数据的标签种类和数量是不是越多越好 4 4 用于预训练的每个vide
  • 时间复杂度-线性对数时间nlogn的一些研究

    文章目录 排序算法的时间复杂度 二叉树与 n l o g 2 n