首页 > 试题广场 >

特征提取

[编程题]特征提取
  • 热度指数:12676 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
       小明是一名算法工程师,同时也是一名铲屎官。某天,他突发奇想,想从猫咪的视频里挖掘一些猫咪的运动信息。为了提取运动信息,他需要从视频的每一帧提取“猫咪特征”。一个猫咪特征是一个两维的vector<x, y>。如果x_1=x_2 and y_1=y_2,那么这俩是同一个特征。
       因此,如果喵咪特征连续一致,可以认为喵咪在运动。也就是说,如果特征<a, b>在持续帧里出现,那么它将构成特征运动。比如,特征<a, b>在第2/3/4/7/8帧出现,那么该特征将形成两个特征运动2-3-4 和7-8。
现在,给定每一帧的特征,特征的数量可能不一样。小明期望能找到最长的特征运动。

输入描述:
第一行包含一个正整数N,代表测试用例的个数。

每个测试用例的第一行包含一个正整数M,代表视频的帧数。

接下来的M行,每行代表一帧。其中,第一个数字是该帧的特征个数,接下来的数字是在特征的取值;比如样例输入第三行里,2代表该帧有两个猫咪特征,<1,1>和<2,2>
所有用例的输入特征总数和<100000

N满足1≤N≤100000,M满足1≤M≤10000,一帧的特征个数满足 ≤ 10000。
特征取值均为非负整数。


输出描述:
对每一个测试用例,输出特征运动的长度作为一行
示例1

输入

1
8
2 1 1 2 2
2 1 1 1 4
2 1 1 2 2
2 2 2 1 4
0
0
1 1 1
1 1 1

输出

3

说明

特征<1,1>在连续的帧中连续出现3次,相比其他特征连续出现的次数大,所以输出3

备注:
如没有长度大于2的特征运动,返回1
cases = int(input())

for j in range(cases):

    num_frames = int(input())

    count_dict = {}
    max_count = 0

    for f in range(num_frames):  # 对于每一帧
        line = list(map(int, input().split()))
        num_features = line[0]
        features = []
        for i in range(1, num_features * 2, 2):  # 对于一帧中的每个feature
            feature = (line[i], line[i+1])
            features.append(feature)
            if feature in count_dict.keys():
                count_dict[feature] += 1
            else:
                count_dict[feature] = 1
        for key in count_dict.keys():  # 如果该帧中没有某个特征,则这个特征从0开始记数
            if key not in features:
                count_dict[key] = 0
        max_count = max(max_count, max(count_dict.values()))  # 记录最大数

    print(max_count)


python解法,直观地使用dict计数即可,没有特别的技巧
发表于 2022-05-03 08:10:25 回复(0)
#把特征出现的帧记录在字典中,并取最长连续帧
n =int(input())
for i in range(n):
    m =int(input())
    #保存不同的帧出现的像素
    num =0
    index =0
    #保存不同特征出现的位置
    dic ={}
    while index < m:
        line =[int(x) forx in input().strip().split()]
        num_pixel =line[0]
        num +=num_pixel
        p =[]
        for j in range(num_pixel):
            term =(line[2*j+1],line[2*j+2])
            if term not in dic:
                dic[term] =[]
                dic[term].append(index)
            else:
                dic[term].append(index)
        index +=1
    #最大连续序列
    max1 =0#全局最大长度
    for key indic:
        sequence =dic[key]
        max2 =1#至少有一个
        s =0
        while s +1< len(sequence):
            if sequence[s+1] ==sequence[s] +1:
                max2 +=1
            else:
                #连续断了,新断归0
                max2 =1
            if max2 > max1:
                max1 =max2
            s +=1
        if max2 > max1:
            max1 =max2
    print(max1)

发表于 2019-08-11 11:01:34 回复(0)