UVa 11536:Smallest Sub-Array(滑动窗口)

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=845&page=show_problem&problem=2531

有n (n106) 个0 ~ m - 1 (m1000) 的整数组成一个序列。输入k (k100) ,你的任务是找一个尽量短的连续的子序列 (xa,xa+1,xa+2,...,xb1,xb) ,使得该子序列包含1 ~ k的所有整数。例如,n = 20, m = 12, k = 4,序列为1 ( 2 3 7 1 12 9 6 3 7 5 4 ) 5 3 1 10 3 3,括号内部分是最优解。如果不存在满足条件的连续子序列,输出sequence nai。(本段摘自《算法竞赛入门经典(第2版)》)

分析:
        滑动窗口思想,直接扫描一遍即可,复杂度为 O(n)

代码:

#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>

using namespace std;

const int maxn = 1000000 + 5, INF = 1000000 + 5;

int T, n, m, k, num, ans, tmp;
int a[maxn], x[105];

int main()
{
    scanf("%d", &T);
    for (int C = 0; C < T; ++C)
    {
        scanf("%d%d%d", &n, &m, &k);
        a[0] = 1;
        a[1] = 2;
        a[2] = 3;
        for (int i = 3; i < n; ++i)
            a[i] = ((a[i - 3] + a[i - 2] + a[i - 1]) % m) + 1;
        ans = INF;
        num = 0;
        memset(x, 0, sizeof(x));
        queue< int > q;
        for (int i = 0; i < n; ++i)
        {
            if (a[i] <= k)
            {
                q.push(i);
                ++x[a[i]];
                if (x[a[i]] == 1)
                    ++num;
            }
            while (num == k)
            {
                tmp = i - q.front() + 1;
                ans = min(ans, tmp);
                if (--x[a[q.front()]] == 0)
                    --num;
                q.pop();
            }
        }
        printf("Case %d: ", C + 1);
        if (ans != INF)
            printf("%d\n", ans);
        else
            printf("sequence nai\n");
    }
    return 0;
}
以下是一个使用PySpark编写的Spark Streaming应用程序,滑动窗口为3小时,滑动步长为5分钟,统计窗口内所有用户的订单金额: ```python from pyspark import SparkContext from pyspark.streaming import StreamingContext from pyspark.streaming.kafka import KafkaUtils sc = SparkContext(appName="OrderAmountWindow") ssc = StreamingContext(sc, 300) # 每5分钟一个批次 ssc.checkpoint("checkpoint") kafka_params = { "metadata.broker.list": "localhost:9092", "auto.offset.reset": "smallest" } kafka_stream = KafkaUtils.createDirectStream(ssc, ["orders"], kafka_params) def update_total_amount(new_values, running_total): if running_total is None: running_total = 0 return sum(new_values, running_total) def process_orders(rdd): orders = rdd.map(lambda x: x[1]) # 只要订单数据 user_orders = orders.map(lambda x: (x['user_id'], x['amount'])) # 转换为(user_id, amount)格式 user_totals = user_orders.reduceByKey(lambda x, y: x + y) # 按user_id聚合订单金额 total_amounts = user_totals.updateStateByKey(update_total_amount) # 累加每个用户的订单金额 total_amounts.pprint() windowed_orders = kafka_stream.window(10800, 300) # 3小时窗口,5分钟步长 windowed_orders.foreachRDD(process_orders) ssc.start() ssc.awaitTermination() ``` 这个应用程序首先从Kafka主题“orders”中读取订单数据流,并将其转换为(user_id, amount)格式。然后,它使用reduceByKey按user_id聚合订单金额,并使用updateStateByKey累加每个用户的订单金额。最后,它在控制台上打印出每个用户的累计订单金额。 在窗口大小为3小时,滑动步长为5分钟的情况下,这个应用程序将为每个用户计算从当前时间向前3小时内的订单总金额,并每5分钟更新一次。 请注意,这个应用程序使用Spark Streaming的updateStateByKey功能来累加每个用户的订单金额。在使用updateStateByKey时,需要提供一个更新函数,该函数将新值与旧值相加,以计算累计值。此外,还需要在运行应用程序之前为应用程序指定一个检查点目录,以便在应用程序重新启动时恢复状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值