南邮离散数学试卷2023(含答案)

 本文一二部分是概念部分的讲解,对于期末试卷可直接跳转至第三部分(南京邮电大学,期末考试,2023,含答案)

一、离散数学简介

离散数学是数学的一个分支,它研究的是离散结构,即不连续的、离散的数学对象。与连续数学(如微积分和分析学)不同,离散数学关注的是可数的对象,如整数、图、逻辑和集合等。离散数学在计算机科学、信息论、数理逻辑、组合数学、数论、代数结构、概率论以及统计学等多个领域都有着广泛的应用。

离散数学的核心内容包括集合论、数理逻辑、组合数学、图论、代数结构和数论等。集合论是离散数学的基础,它研究的是集合的性质以及集合之间的关系。集合论提供了一种描述和操作离散对象的数学语言,是理解其他离散数学概念的基础。

数理逻辑是研究推理和证明的数学分支,它包括命题逻辑和谓词逻辑。命题逻辑研究的是简单的陈述句(命题)的逻辑结构,而谓词逻辑则研究的是更复杂的逻辑结构,包括量词和变量。数理逻辑是计算机科学中程序验证、人工智能和逻辑编程等领域的基础。

组合数学是研究离散结构的计数、排列和组合的数学分支。它涉及到的问题包括如何计算特定结构的数量、如何排列和组合对象,以及如何优化这些结构。组合数学在计算机科学中的算法设计、密码学和网络设计等领域有着重要的应用。

图论是研究图的数学分支,图是由顶点和边组成的结构,用于表示对象之间的关系。图论在计算机科学中的网络设计、数据结构、算法设计以及社会科学中的社会网络分析等领域都有着广泛的应用。

代数结构是研究代数系统的数学分支,如群、环和域等。这些代数系统由一组元素和定义在这些元素上的运算组成。代数结构在计算机科学中的密码学、编码理论和算法设计等领域有着重要的应用。

数论是研究整数的数学分支,它涉及到的问题包括素数、整数的分解、同余和数的性质等。数论在计算机科学中的密码学、算法设计和随机数生成等领域有着重要的应用。

离散数学的另一个重要应用是计算机科学的基础。在计算机科学中,离散数学的概念和方法被用来设计和分析算法、数据结构、编程语言和软件工程。例如,图论被用来设计网络和数据库,数理逻辑被用来设计编译器和验证程序的正确性,组合数学被用来优化算法和解决计数问题。

此外,离散数学在其他领域也有着广泛的应用。在信息论中,离散数学被用来研究信息的编码和传输;在统计学中,离散数学被用来研究随机变量和概率分布;在经济学中,离散数学被用来研究市场模型和决策问题。

总的来说,离散数学是现代科学和技术的基础,它提供了一种理解和处理离散结构的数学工具。通过学习离散数学,我们可以更好地理解计算机科学、信息论、数理逻辑、组合数学、数论、代数结构和概率论等领域的基本概念和方法。离散数学不仅在理论研究中有着重要的地位,而且在实际应用中也发挥着关键的作用。

二、南邮期末考试资源爬虫

        首先申明爬虫的使用需要遵守相关网站的使用条款和法律法规。在大多数情况下,未经授权爬取网站数据是不合法的,也可能违反网站的服务条款。此处提供一个合法使用爬虫技术的示例,比如爬取公开API的数据。下面是一个使用Python和requests库从一个公开API获取数据的简单示例:

import requests
from bs4 import BeautifulSoup
import json
import time
from urllib.parse import urlencode

# 设置请求头,模拟浏览器访问
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}

# 设置API的基础URL和参数
base_url = 'https://api.github.com/users/kimi/repos'
params = {
    'per_page': 100,  # 每页显示的仓库数量
    'page': 1         # 当前页码
}

# 存储获取到的数据
repos_data = []

def fetch_repos(url, params):
    try:
        response = requests.get(url, headers=headers, params=params)
        response.raise_for_status()  # 如果请求返回了一个错误状态码,将抛出HTTPError异常
        return response.json()
    except requests.exceptions.HTTPError as e:
        print(f"HTTP error occurred: {e}")  # 打印HTTP错误
    except requests.exceptions.RequestException as e:
        print(f"Error fetching repos: {e}")  # 打印请求错误
    return None

def save_data(data):
    with open('repos.json', 'w') as f:
        json.dump(data, f, indent=4)  # 将数据写入文件

def main():
    global params
    while True:
        print(f"Fetching page {params['page']}...")
        repos = fetch_repos(base_url, params)
        if not repos:
            break
        repos_data.extend(repos)
        if len(repos) < params['per_page']:  # 如果当前页的仓库数量小于每页的数量,说明已经到最后一页了
            break
        params['page'] += 1  # 准备下一页的请求
        time.sleep(1)  # 休眠1秒,避免过快请求导致IP被暂时封禁

    save_data(repos_data)
    print(f"Total repos fetched: {len(repos_data)}")

if __name__ == "__main__":
    main()

        这个示例展示了如何使用Python进行基本的网络爬虫操作,包括处理分页、异常处理、用户代理的使用,以及数据的持久化存储。此外,爬虫技术还可以用于更复杂的场景,如爬取动态加载的内容,这通常需要使用Selenium等工具来模拟浏览器行为。在处理这类内容时,你需要考虑更多的因素,如JavaScript的执行、页面的DOM结构变化等。

        除此之外,还需要进行网络的抓包。网络抓包通常是指捕获和分析网络上的数据包,这在网络安全、性能分析和调试网络应用程序时非常有用。在Python中,可以使用scapy库来实现网络抓包。scapy是一个强大的Python库,用于网络包的发送、嗅探和分析。下面是一个使用scapy进行网络抓包的简单示例。使用scapy库。这个脚本将捕获网络数据包,分析TCP和UDP流量,过滤特定端口,统计各种协议的数据包,并将捕获的数据包保存到文件中。

from scapy.all import sniff, Ether, IP, TCP, UDP, ICMP
from scapy.all import wrpcap, rdpcap
import datetime
import json

# 定义一个字典来存储各种协议的数据包数量
packet_counts = {'TCP': 0, 'UDP': 0, 'ICMP': 0}

# 定义一个字典来存储特定端口的数据包数量
port_counts = {}

# 定义一个列表来存储捕获的数据包
captured_packets = []

# 定义一个回调函数来处理每个捕获的数据包
def packet_callback(packet):
    global packet_counts, port_counts, captured_packets
    
    # 打印每个捕获的数据包的详细信息
    print(packet.summary())
    
    # 根据协议类型增加计数
    if packet.haslayer(TCP):
        packet_counts['TCP'] += 1
        port = packet[TCP].dport
        if port in port_counts:
            port_counts[port] += 1
        else:
            port_counts[port] = 1
    elif packet.haslayer(UDP):
        packet_counts['UDP'] += 1
        port = packet[UDP].dport
        if port in port_counts:
            port_counts[port] += 1
        else:
            port_counts[port] = 1
    elif packet.haslayer(ICMP):
        packet_counts['ICMP'] += 1
    
    # 保存数据包到列表
    captured_packets.append(packet)

    # 保存数据包到PCAP文件
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
    wrpcap(f"captured_packets_{timestamp}.pcap", captured_packets, append=True)

# 设置过滤条件,例如只捕获TCP、UDP和ICMP数据包
filter = "tcp or udp or icmp"

# 使用sniff函数捕获数据包
# 参数count表示捕获的数据包数量
sniff(filter=filter, prn=packet_callback, count=100)

# 打印各种协议的数据包数量
print("Packet counts:")
for protocol, count in packet_counts.items():
    print(f"{protocol}: {count}")

# 打印特定端口的数据包数量
print("\nPort counts:")
for port, count in port_counts.items():
    print(f"Port {port}: {count}")

# 保存统计数据到JSON文件
with open('packet_stats.json', 'w') as f:
    json.dump({'packet_counts': packet_counts, 'port_counts': port_counts}, f, indent=4)

# 读取并打印PCAP文件中的数据包
pcap_file = f"captured_packets_{timestamp}.pcap"
packets = rdpcap(pcap_file)
print(f"\nReading from {pcap_file}:")
for packet in packets:
    print(packet.summary())

        这个示例展示了如何使用scapy进行更复杂的网络抓包,包括数据包的统计、过滤、保存和分析。你可以根据需要进一步探索scapy的高级功能,如协议分析、数据包重组等。

三、期末试卷及答案

830af83097524f1904b7b4eaa028f21d.jpeg

f0d198e70d8b2004847ecd56be40b362.jpeg

856f2d3f5b7d6d462d5e2d4ade26d15b.jpeg

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摆烂仙君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值