SW练习_ADV_excel_BFS

这篇博客探讨了一个在SW练习中遇到的重复题目,该题目涉及使用宽度优先搜索(BFS)来解决Excel相关的问题。作者指出,相同的题目被提出两次,引发了一些讨论。

真能扯啊,同样的题目出了两遍。

package info.frady.adv;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;

/**
 2
 10 9
 1 6
 1 9
 7 10
 7 5
 10 8
 6 2
 9 2
 2 4
 2 5
 10 8
 1 2
 1 9
 7 10
 7 5
 10 8
 6 2
 9 2
 2 4

 #1 5
 #2 3
 */
public class Excel {
    static NodeExcel2[] nodes;
    static boolean[] marked;
    public static void main(String[] args) throws Exception{

        System.setIn(new FileInputStream("C:\\Users\\86153\\Desktop\\SW\\excel\\系统判分用测试用例.txt"));
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st=new StringTokenizer(reader.readLine());
        int T=Integer.parseInt(st.nextToken());//测试用例的个数
        for (int i = 0; i <T ; i++) {
            st=new StringTokenizer(reader.readLine());
            int N=Integer.parseInt(st.nextToken());//N个点
            int M=Integer.parseInt(st.nextToken());//M次关联
            int C=Integer.parseInt(st.nextToken());//M次关联
            nodes=new NodeExcel2[N+1];
            marked=new boolean[N+1];
            for (int j = 0; j <nodes.length ; j++) {
                nodes[j]=new NodeExcel2(j);
            }
            for (int j = 0; j <M ; j++) {
                st=new StringTokenizer(reader.readLine());
                int start=Integer.parseInt(st.nextToken());
                int end=Integer.parseInt(st.nextToken());
                nodes[start].sonList.add(end);

                //System.out.println(Arrays.toString(pid));
            }
            int count=0;
            for (int j = 0; j <C ; j++) {
                st=new StringTokenizer(reader.readLine());
                int qq=Integer.parseInt(st.nextToken());
                //count=count+processBFS(qq);
                processBFS(qq);
            }
            for (int j = 1; j <marked.length ; j++) {
                if(marked[j]){
                    count++;
                }
            }

            System.out.printf("#%d %d\n",(i+1),count);

        }
        reader.close();
    }
    public static int processBFS(int start){
        LinkedList<Integer> list=new LinkedList<>();
        list.add(start);
        int count=0;
        while(!list.isEmpty()){
            int index=list.pop();
            marked[index]=true;
            //if(index!=start){
                count++;
           // }
            for (int sindex:nodes[index].sonList) {
                list.add(sindex);
            }
        }
        return count;

    }


}

class NodeExcel{
    int index;
    List<Integer> sonList;
    public NodeExcel(int index){
        this.index=index;
        this.sonList=new ArrayList<>();
    }
}

 

<think>首先,用户的问题是关于BLE_FAST_ADV的:含义、使用方法和技术原理。用户提供了三个引用,我需要参考这些内容来回答。 回顾引用内容: - 引用[1]:包含了BLE广播初始化的代码片段。里面提到了`options.ble_adv_fast_enabled`和`options.ble_adv_fast_interval`,这看起来是在Nordic芯片上的BLE相关代码。代码设置了快速广播模式。 - 引用[2]:讨论了Google规范的BLE广播,涉及随机地址和数据校验。这可能与BLE广播的安全性相关。 - 引用[3]:提到了广播的流程图:Direct -> Direct Slow -> Fast -> Slow -> Idle,以及白名单。这描述了广播的序列。 用户上一次的问题是询问BLE_FAST_ADV的含义、使用方法和技术原理,所以我需要基于这些引用构建回答。 关键点: - BLE_FAST_ADV 可能指的是 Bluetooth Low Energy (BLE) 中的快速广播模式。 - 在BLE中,广播(Advertising)是设备向其他设备宣告自己存在的方式。 - 广播模式包括不同的类型,如快速广播(fast advertising)和慢速广播(slow advertising),用于节省能源和优化连接。 基于引用: - 从引用[1]:`options.ble_adv_fast_enabled` 被设置为 `BLE_ADV_FAST_ENABLED`,并指定了间隔和超时。这表明快速广播是一种模式,其中广播间隔较短,以提高发现速度。 - 引用[3]提到了广播流:从Fast模式开始。这可能意味着在不同阶段广播间隔变化。 - 引用[2]强调了广播数据的安全性和随机地址,这与技术原理相关,但可能不直接针对FAST_ADV。 回答结构: 1. **含义**:解释BLE_FAST_ADV是什么。它是BLE广播的一种模式,使用较短的广播间隔,使设备更容易被发现,但会增加能耗。 2. **使用方法**:提供如何使用它。参考引用[1],在初始化广播时设置选项,如启用快速广播、指定间隔。 3. **技术原理**:解释工作原理。包括广播间隔、功耗权衡、如何影响设备发现和连接。 系统级指令: - 所有行内数学表达式用$...$,但这里可能不涉及数学,所以跳过或不强制使用。 - 独立公式用$$...$$,同样,可能不需要。 - LaTeX语法正确:确保任何公式正确。 - 使用中文回答。 - 生成相关问题:在末尾添加相关问题。 - 引用末尾添加标识:[^1], [^2], [^3]。 用户可见层:结构清晰,一步步回答问题,确保真实可靠。参考提供的引用。 生成相关问题:基于BLE广播主题,如优化、安全考虑等。 完整回答框架: - 引言:BLE_FAST_ADV是BLE中的一个概念。 - 含义:定义并解释。 - 使用方法:基于代码示例。 - 技术原理:深入解释。 - 结论。 - 相关问题。 确保语言专业且易懂。 </think>以下是针对您问题的详细解答。BLE(Bluetooth Low Energy)中的“BLE_FAST_ADV”特指一种快速广播模式,主要用于优化设备的可发现性和连接速度。我将基于您提供的引用(尤其是引用[1]和引用[3])以及BLE规范,逐步解释其含义、使用方法和技术原理。回答保证真实可靠,主要参考Nordic芯片平台的实现(如nRF51/nRF52系列),因为这符合引用中的代码上下文[^1][^3]。 ### 1. **BLE_FAST_ADV的含义** BLE_FAST_ADV代表“快速广播模式”(Fast Advertising Mode),是BLE设备在广播阶段使用的一种高频率广播策略。其核心目的是缩短设备被发现的时间,适用于需要快速建立连接的应用场景(如设备配对或实时数据传输)。 - **关键特点**: - **广播间隔短**:在快速模式下,广播间隔(例如20ms至100ms)远低于慢速模式(可能为1s或更长),这减少了扫描设备的等待时间[^1][^3]。 - **能耗权衡**:虽然快速广播会消耗更多电量(因频繁发送数据包),但它只在有限时间内启用(如超时设置为几秒),以避免长期高能耗。引用[1]中的`APP_ADV_TIMEOUT_IN_SECONDS`定义了超时时间(单位秒),超过后会切换到慢速或空闲模式[^1]。 - **广播序列**:BLE广播通常遵循一个序列流程(direct -> direct slow -> fast -> slow -> idle),其中FAST_ADV是中间阶段,用于在初始广播后加速设备发现[^3]。 在系统设计中,FAST_ADV常用于BLE连接的初始阶段,确保设备能迅速被扫描器(如智能手机)检测到。 ### 2. **BLE_FAST_ADV的使用方法** 在BLE开发中(如使用Nordic SDK),启用FAST_ADV需要通过API配置广播参数。以下是具体步骤,基于引用[1]中的代码示例(已简化并添加注释): ```c // 初始化广播参数 void advertising_init(void) { ble_adv_modes_config_t options = {0}; // 定义广播模式配置结构体 options.ble_adv_fast_enabled = BLE_ADV_FAST_ENABLED; // 启用快速广播模式 options.ble_adv_fast_interval = APP_ADV_INTERVAL; // 设置快速广播间隔 (单位: 0.625ms) options.ble_adv_fast_timeout = APP_ADV_TIMEOUT_IN_SECONDS; // 设置超时(例如10秒) // 调用初始化函数,传入广播数据、扫描响应和选项 err_code = ble_advertising_init(&advdata, &scanrsp, &options, on_adv_evt, NULL); APP_ERROR_CHECK(err_code); // 检查错误 } ``` - **关键参数解释**: - `ble_adv_fast_enabled`:设为`1`或`BLE_ADV_FAST_ENABLED`以启用快速模式。 - `ble_adv_fast_interval`:广播间隔值,计算方式为$ \text{interval} \times 0.625 \, \text{ms} $。例如,值160对应100ms间隔(因为$160 \times 0.625 = 100$)。 - `ble_adv_fast_timeout`:超时时间(秒),超过后自动切换到慢速模式或停止广播(如引用[3]所述)。 - **实践建议**: - 在需要快速连接的场景(如智能设备配对)启用此模式。 - 结合白名单(whitelist)功能(如引用[3]提及)可提高安全性,只允许特定设备连接[^3]。 - 注意广播数据的安全性:引用[2]强调使用随机地址(RPA)和数据校验(如salt值),以防止嗅探攻击[^2]。 ### 3. **BLE_FAST_ADV的技术原理** BLE_FAST_ADV的工作原理基于BLE的广播机制,涉及物理层和协议层的优化。核心原理是平衡“可发现性”和“能耗”。 - **广播机制基础**: - BLE设备通过广播信道(37, 38, 39号信道)发送广播包。FAST_ADV使用更短的广播间隔(如100ms),增加了相同时间内的包发送频率。 - 广播间隔公式:广播间隔$ T_{\text{adv}} $定义为$ \text{interval} \times 0.625 \, \text{ms} $,FAST_ADV的interval值较小(例如20-160),导致$ T_{\text{adv}} $值在毫秒级[^1]。 - **功耗与性能权衡**: - **快速发现**:高频率广播增加了接收概率。扫描设备在较短信道间隔(如10ms)内更容易捕获广播包,从而加快连接建立。 - **能量管理**:FAST_ADV通常设置超时(如`APP_ADV_TIMEOUT_IN_SECONDS = 10`),之后切换到慢速广播或空闲模式,以节省电量(引用[3]的序列:Fast → Slow → Idle)。 - **安全考虑**: - 引用[2]提到,广播地址应使用随机私有地址(RPA)和数据校验(salt值),防止伪造攻击。在FAST_ADV中,这保证了高频广播的安全性(如Google GFPS规范)[^2]。 - **底层实现**: - Nordic芯片的SDK(如`ble_advertising`模块)处理广播序列。初始化时,`ble_advertising_init()`函数应用选项,控制状态机在不同模式间切换。 ### 总结 BLE_FAST_ADV是一种优化BLE设备可发现性的广播模式,通过缩短广播间隔实现快速连接,但需注意能耗控制。使用方法涉及配置广播参数(如间隔和超时),技术原理基于BLE协议的广播机制和功耗管理。在实际开发中,参考Nordic SDK的实现(如引用[1])并结合安全措施(如引用[2]),可以高效应用此功能。如果您有具体平台或代码细节,我可以提供更针对性的建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值