连续递增子串最长长度的数学期望

参考

【1】:

longest consecutive subsequence of a random permutation

    第一个帖子:    

    Theorem: The expected length of the longest increasing block in a random permutation of {1,2,…,n} is r0(n)+O(1) as n→∞, where r0(n) is the smallest positive integer such that r0(n)!>n. ("Block" means consecutive subsequence ai+1,ai+2,…,ai+r for some i and r, with no conditions on the relative sizes of the ai.)

证明反正也没看懂我也就不说啥了,结论是:r + C,其中 r是 r!>n的最小正整数,C是一个常数。(但是很奇怪程序运算起来和这个结论略有出入)

    第二个帖子说:子串长度r大概是这个函数增长的,r=log(n)/W(log(n)/e),因为W函数比Log增长略慢,所以r增长比logn/loglogn略快,并非如猜想的~logn。

【2】:

LISBOOK   (如果是非连续的子串的话,长度趋近与2√n)

正文

偶然翻微博看到2013年问桑爷一个问题。如果一个随机的数数列,长度是是L,其元素是1-L不重复。问这个数列的连续递增子串的最长的长度的数学期望是多少?比如13254的最长连续递增子串是25,长度就是2。

当时我算了好久啊,没算出来……当然至今也没算出来,昨天写了个小程序算了一下。

打乱排序的函数用了库函数random_shuffle(...):

random_shuffle( int *A, int L);

求解的函数非常简单,扫一遍得到结果。

 1 int calc(int *A,int L){
 2     int max = 1;
 3     int cur = 1;
 4
 5     if(!L) return 0;
 6     For(i,L-1){
 7         if(A[i+1] >= A[i] ){
 8             cur++;
 9             max = max>cur?max:cur;
10         }else{
11             cur = 1;
12         }
13     }
14     return max;
15 }

于是得到如下结果:

图一:横轴:数列长度n,纵轴平均长度E

其中0<=n<=350000

看上去增长貌似是lg级的啊,于是重新算一下,取对数看看。

图二:n=10,10^2,10^3...10^9.

图三:图二的散点图

猜想平均期望是 ~log(n)的了,不过正如文章开头所提,其实是~logn/loglogn。

学数学人的脑子真变态。。。

时间: 2024-10-13 15:34:58

连续递增子串最长长度的数学期望的相关文章

最长连续递增子串

题目链接:https://leetcode.com/problems/longest-continuous-increasing-subsequence/description/ class Solution { public: int findLengthOfLCIS(vector<int>& nums) { int n = nums.size(); if(n<=1) return n; int res = 1, len=1; for(int i=1; i<n; i++)

LeetCode - 最长连续递增序列

题目描述: 给定一个未经排序的整数数组,找到最长且连续的的递增序列. 示例 1: 输入: [1,3,5,4,7] 输出: 3 解释: 最长连续递增序列是 [1,3,5], 长度为3.尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开. 示例 2: 输入: [2,2,2,2,2] 输出: 1 解释: 最长连续递增序列是 [2], 长度为1. code: public class Solution { public int findLengthOfLCIS(i

最长连续公共子串、最长公共子串(可以非连续)、最长回文串(连续)、最长回文串(可以不连续)、最长递增数组的求解

问题:最长连续公共子串.最长公共子串(可以非连续).最长回文串(连续).最长回文串(可以不连续).最长递增数组.长方形镶嵌最多的求解 方法:上述问题有相似性,都可以采用动态规划进行求解. (1)最长连续公共子串: 如果A[i]==B[j], dp[i][j]=dp[i-1][j-1]+1; 否则,dp[i][j]=0; (2)最长公共子串(可非连续): 如果A[i]==B[j], dp[i][j]=dp[i-1][j-1]+1; 否则,dp[i][j]=dp[i-1][j-1]; (3)最长回文

最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和

参考:http://www.ahathinking.com/archives/124.html 最长公共子序列 1.动态规划解决过程 1)描述一个最长公共子序列 如果序列比较短,可以采用蛮力法枚举出X的所有子序列,然后检查是否是Y的子序列,并记录所发现的最长子序列.如果序列比较长,这种方法需要指数级时间,不切实际. LCS的最优子结构定理:设X={x1,x2,……,xm}和Y={y1,y2,……,yn}为两个序列,并设Z={z1.z2.……,zk}为X和Y的任意一个LCS,则: (1)如果xm=

得到最长连续递增序列

今天作死,看到别人发出来的笔试题就开干了,这tmd还理解错题目了,连续递增序列理解成上一个=下一个-1了. 这是我的成果,撸了4个多小时的: public class Test12 { public static void main(String[] args){ /** * 需求:找出最长的连续递增序列 * 步骤: * 1.找出所有连续序列可能结果,删除不是连续递增序列的,加入集合 * 2.集合排序,取第一个 * * 方式2: * 0.默认len为数组长度 * 1.找出数组中长度为len的序列

任意区间的最长连续递增子序列,最大连续子序列和

hdu3308 给n个数,有m个操作 U a b 表示将第a个数改成b Q a b 表示询问区间[a,b]的最长连续递增子序列. 区间询问问题且带修改,一般是用线段树来解决 那么要维护 Llen[rt], Lval[rt][2] 表示rt所对应的区间[l,r] 以l开头的最长连续递增子序列的长度, Lval[rt][0]表示子序列的最左边的值,Lval[rt][1]表示子序列最右边的值 Rlen[rt],Rval[rt][2]  表示rt所对应的区间[l,r]以r结尾的最长连续递增子序列的长度,

找出所有最长连续重复子串及其个数

问题描述: 找出字符串中所以最长连续重复子串及其个数 比如:输入:123234,最大连续重复字符串为23,个数为2 输入:5555,最大连续重复字符串为555,个数为2 输入:aaabbb 最大连续重复字符串为aa,个数为2:和bb,个数为2 必须存在重复的字符串才算,只出现一次的不算.可能存在多个相同长度的不同字符串,比如aaabbb. 分析:最直接的想法是利用两个指针循环遍历比较所有可能的子串,记录下所有子串长度,然后找到所有最大连续子串及其个数,时间复杂度为O(n^2).在网上看到一种利用

两个字符串的最长连续公共子串

LCS(Longest Common Subsequence) 就是求两个字符串最长公共子串的问题.引入: LCS(Longest Common Subsequence) 就是求两个字符串最长公共子串的问题. 比如: String str1 = new String("adbccadebbca");  String str2 = new String("edabccadece");str1与str2的公共子串就是bccade. 解法就是用一个矩阵来记录两个字符串中所

最长连续递增子序列(部分有序)

题目:(1,9,2,5,7,3,4,6,8,0,)中最长的递增子序列为(3,4,6,8). 代码: public class 最长递增子序列 { public static void main(String[] args) { int []arr = {1,0,2,5,7,3,4,6,8,9,1,2}; getLargestLen(arr); } private static void getLargestLen(int[] arr) { int begin=0; // 最长递增子序列长度的开始