在长度为5000000的整型向量中找到相等元素的最长子向量。

5个视图(过去30天)
菲利普Berntsson
菲利普Berntsson 2021年1月23日
评论道: 图像分析员 2021年1月23日
你好!
正面: 从技术上讲 这是一个家庭作业问题,但我已经完成了,只是想要你的想法,如果代码可以更快/更好。
任务是找出有多少不同长度的相同数字序列出现在数据中。即在data=[1,1,1,2,2,3,3,4,4]中长度为3的序列出现一次,长度为2的序列出现三次。所以我想要外观=[0,3,1,0,…(索引表示序列的长度)
数据通常是一个长度为5000000的向量,并且您不知道最长的序列有多长(否则我可能会使用strfind并抽取数据)。而且,这是在序列的起始索引以后可能变得重要的上下文中完成的,即使我没有自动提取它们。
下面提交的代码应该只需要遍历数据向量一次就可以提取所有必要的信息。但它至少比我认为的要慢两倍。
你对如何更快/更干净地解决这个任务有什么想法吗?很想看看你的想法。/ FB
%查找数据中最长的相似序列
%数据大小通常为1x500000(例如,pi或e中的前500万位)
data =[1, 1, 1、2、1,1,3,3,2,4,4,4,5,6,7,8,8,9,9日,9日,8、8、7、7、5、5、4、6、6、2、5、9、9,9日,9日,7日,7日,7日,7日,8日8日4,4、5、5、6、6、4、4、5、5、1、1、2、1,3,3,1];
外观=零(10,1);%计算特定长度为1:10的序列出现的次数。
%假设我们不会在数据中找到长度超过10的类似序列,例如1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
我= 2;当近似for循环时%counter s.t。不使用for,因为不能在for循环中手动更改i
%从2开始,因为每次查看2个数字以比较是否相等
虽然i<长度(数据)
等质量=(数据(i-1)=数据(i));如果序列中的数字相等,则为真。1,1表示真,1,2表示假,等等。
转换isEqual
案例符合事实的
%保存序列开始的位置,并在检查是否相等时保持递增
启动i=i-1;
虽然等长&(i<长度(数据))
i=i+1;
等质量=(数据(i-1)=数据(i));
结束
%计算序列的长度并记录为该长度的新外观
end_i =张;
sequenceLength=(结束\u i-开始\u i+1);
外观(sequenceLength)=外观(sequenceLength)+1;
案例
%继续递增并查找序列
虽然~ isEqual&&(我<长度(数据))
i=i+1;
等质量=(数据(i-1)=数据(i));
结束
结束
结束
%要找出长度为一的序列,就要减去所有其他序列的总和
%序列从数据的长度
外观(1)=长度(数据)-总和(外观);

公认的答案

马特·J
马特·J 2021年1月23日
编辑:马特·J 2021年1月23日
data = [1, 1, 1, 2, 2, 3, 3, 4, 4];
SequenceLength=diff(find(diff([inf,data,inf]));
result = histcounts(sequenceLengths, 1:max(sequenceLengths)+1)
结果= 1×3
0 3 1
2的评论

登录评论。

答案(1)

图像分析员
图像分析员 2021年1月23日
下面是我想到的方法,使用regionprops来计算每个结果运行数的长度:
数据=[1,1,1,2,1,3,3,2,4,4,4,5,6,7,8,8,9,9,9,9,8,8,7,7,5,5,4,6,6,2,5,9,9,9,7,7,7,8,4,4,5,5,1,2,1,3,1]
唯一数据=唯一(数据)
%预分配一个数组,我们认为可能的最长运行长度是多少,比如1000左右
外观=零(1000,2);%计算特定长度为1:10的序列出现的次数。
%为了方便我们查看输出矩阵,将长度放入第2列。
外观(:,1)=[1:尺寸(外观,1)];
k=1:长度(唯一数据)
得到这个唯一的数字。
该值=唯一数据(k);
%用k查找区域
props = regionprops(data == thisValue,“区域”);
%增加每个数据长度的计数。
K2 = 1:长度(道具)
外观(道具(k2)。面积,2)=外观(道具(k2)。面积,2)+1;
结束
结束
外表%在命令窗口中显示。
%从没有该长度的料箱中切下。
lastBin=find(外观(:,2)>0,1,“最后一次”);
外观=外观(1:lastBin,:)%在命令窗口中显示。
您将在命令窗口中看到最终结果:
外表=
1 11
2 15
3 3
4 2
因此有11个长度为1的序列,15个长度为2的序列,3个长度为3的序列和2个长度为4的序列。与Matt的结果相同(如果使用相同的向量),这只是一种不同的方法。
2的评论
图像分析员
图像分析员 2021年1月23日
和你一样,我也认为马特的回答有些晦涩,所以我给出了一个更直观、更容易理解的方式。但如果我的需要更长的时间而你想要的是速度,那就用马特的方法。

登录评论。

下载188bet金宝搏


释放

R2020b

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始打猎吧!