Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 次线性算法/查找不同元素的最后一个_Arrays_Algorithm_Language Agnostic_Complexity Theory - Fatal编程技术网

Arrays 次线性算法/查找不同元素的最后一个

Arrays 次线性算法/查找不同元素的最后一个,arrays,algorithm,language-agnostic,complexity-theory,Arrays,Algorithm,Language Agnostic,Complexity Theory,背景信息,如果您不介意,请跳过: 今天我为一个项目录制了一些音频,一段一段地做。如果我把这一段弄错了,我会重做,直到把它弄好,然后继续下一段。当我把它们加载到计算机上时,我需要找到每个段落的最后一段录音。在不知道我为某个段落录制了多少次录音的情况下,我该怎么做?(难道你不喜欢算法潜入你的日常生活吗?) 在算法方面,您有一个元素数组,其中每个元素后面要么跟有相同类型的另一个元素,要么跟有一个完全不同的元素。找到序列的最后一个元素(正确录制的音频片段) 问题: 因此,您有一个对象数组,其中每个元素都

背景信息,如果您不介意,请跳过:

今天我为一个项目录制了一些音频,一段一段地做。如果我把这一段弄错了,我会重做,直到把它弄好,然后继续下一段。当我把它们加载到计算机上时,我需要找到每个段落的最后一段录音。在不知道我为某个段落录制了多少次录音的情况下,我该怎么做?(难道你不喜欢算法潜入你的日常生活吗?)

在算法方面,您有一个元素数组,其中每个元素后面要么跟有相同类型的另一个元素,要么跟有一个完全不同的元素。找到序列的最后一个元素(正确录制的音频片段)

问题:

因此,您有一个对象数组,其中每个元素都有一个id字段,其中每个id都在下面的列表中。我想要最后一个id的对象,比如在id数组中,如下所示:

aabbbbbccddddddddddddddeefffffffffggghhhhiiiijjklmnnnnoo
显然,如果字符串的长度为n,并且有n个不同的元素,则需要n个步骤才能计算出来。我对一般算法更感兴趣。我可以用一个二进制搜索类型的算法来实现,但是我不知道它的运行时间,因为除了元素总数之外,我不知道输入的情况


另外,知道不同id的数量会改变算法的运行时间吗?这对我来说是一个有趣的问题,我只是想满足我的好奇心。

二进制搜索的运行时间与log(n)成正比。这意味着您添加的元素越多,其增长越慢。更准确地说,问题规模的指数增长意味着执行时间的线性增长。换句话说,每次你的录音数量翻倍时,你都需要再听一次才能找到你想要的


为了进行二进制搜索,你将从记录列表的中间开始,找出你想要的记录是在它之前还是之后,然后丢弃不包含它的一半。如果录音是正确的段落(但您不知道它是好是坏),则将其与after分组,并丢弃它之前的所有录音。继续消除一半(通过听中间的一个),直到你减少到1或2个录音。

你应该能够查看第一个id,并对该id的结束位置进行二进制搜索。这可以在O(logn)时间内完成

然后前进到下一个元素,重新进行二进制搜索,查找id序列的结束位置

这产生了一个复杂度为O(m×logn)的算法,其中n是元素数,m是不同元素数

假设n/m(特定id的平均元素数)大于logn,则得到一个次线性算法

如果n/m小于log n,则最好线性搜索id序列的结尾


(请注意,整个分析取决于列表是根据ID排序的。排序通常需要与n×log n成比例的时间,因此,如果需要对它们进行排序,也可以使用线性算法:-)

获取数组中的第一个和最后一个元素,并分析该范围内的中间元素。如果找到新的
id
,则将最后一个元素放入堆栈(使用
id
及其到目前为止找到的位置范围)。否则,继续在最低和中间元素之间的范围内进行二进制搜索。找到最后一个不同的元素后,弹出堆栈并继续搜索

时间复杂度为
O(m*log(n/m))
,空间复杂度为
log(m)
。其中
m
是不同值的数目。

传统的二进制搜索的变体不是分割整个空间,而是几何增长。也就是说,如果你在位置p,试着看p+1,p+3,p+7,p+15,…,直到你找到一个新id发生变化的区间,在那里你可以通过经典的二进制搜索来分割它,或者甚至在最后一个已知的好位置重新开始新的增长


复杂性可能与以前相同,即O(m*logn),但这可能更适合您的问题,因为相同ID的运行时间被假定为相对较短(大约n/m)。

您能从两个不同的ID中分辨出中间是否有ID吗?不,除非你知道身份证的总数,并且你已经看过足够多的资料,可以把各个部分归类。这是一个更纯粹的思考问题,问题的要求是可延展的。你的n个不同元素的例子证明,没有通用算法可以保证性能优于O(n)。我不是在寻找一个特定的录音,我是在寻找具有不同元素的所有最后录音。在你的例子中,我想你的意思是,如果n/m大于logn,你会得到一个次线性算法,即m*logn