数据结构浅记◕‿◕

一、绪论

数据结构: 计算机中存储和组织数据的方式‌,

可以把数据结构分为 逻辑结构物理结构

1.1 逻辑结构

逻辑结构 :指数据元素之间存在的逻辑关系,面向问题的

1 集合:数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系 ;
2.线性结构:数据结构中的元素存在一对一的相互关系 ;
3.树形结构:数据结构中的元素存在一对多的相互关系 ;
4.图形结构:数据结构中的元素存在多对多的相互关系 。

在这里插入图片描述

1.2 物理(存储)结构

物理结构:指数据的逻辑结构在计算机中的存储形式,因此也称为 存储结构 是面向计算机的
数据的 存储结构 应正确反映数据元素之间的 逻辑关系

1 顺序存储:
是把数据元素存放在地址连续的存储单元里 其数据间的逻辑关系和物理关系是一致的

在这里插入图片描述

2 链式存储:
是把数据元素存放在任意的存储单元里 这组存储单元可以是连续的 也可以是不连续的

在这里插入图片描述

1.3 算法、时间复杂度&空间复杂度

什么是算法

算法是一种计算过程,通过一系列有序的步骤来执行特定的任务

算法的特性

明确定义: 算法应该具有明确的步骤,对于任何给定的输入,都应该产生确定的输出。

有限性: 算法必须在有限步骤内结束,不会无限循环或无法终止。

输入: 算法可以有零个或多个输入,这些输入是用来执行特定任务的数据。

输出: 算法应该产生一个或多个输出,以表示完成任务的结果。

算法的度量指标

时间复杂性: 衡量算法执行所需时间的指标,通常用大O表示法来表示。
较低的时间复杂性通常意味着更高的性能。

 n为问题的规模,f(n)为执行次数的系数为1的最小阶,O(f(n))表示时间复杂度。

空间复杂性: 衡量算法在执行过程中所需内存空间的指标。与时间复杂性类似,我们希望尽量减少算法的空间占用。

在这里插入图片描述

二、内部排序(Internal sort)

也称内部排序算法 是指利用计算机内部存储器(RAM)进行的排序方法

内部排序算法包括
交换排序:冒泡排序、快速排序
插入排序:直接插入排序、希尔排序 
选择排序:简单选择排序、堆排序
归并排序:二路归并、多路归并
内部排序的优缺点
优点:
    算法实现简单,比较适用于数据规模较小的排序
    某些排序算法可以利用计算机的快速运算能力,提高排序效率
缺点:
    对于数据规模较大的排序,排序效率较低
    受计算机内部存储器的影响,排序数据的范围有限
    某些排序算法的时间复杂度较高,排序效率较低

2.1 交换:冒泡排序

相邻的元素两两比较,有n个元素最多就要执行 (n - 1)次比较

在这里插入图片描述

#include <stdio.h>

void bubble_sort(int arr[], int len) 
{
   int i, j, temp;
   for (i = 0; i < len - 1; i++)  // N个数,有 N-1 轮
    {
     for (j = 0; j < len - 1 - i; j++) //确认位置
     	{ 
         if (arr[j] > arr[j + 1]) 
	         {
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
	         }
         }
    }
}

int main() 
{
	int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
	int len = (int) sizeof(arr) / sizeof(*arr);//总字节 除以 单个数的字节
	bubble_sort(arr, len);
	int i;
	for (i = 0; i < len; i++)
	   printf("%d ", arr[i]);
	return 0;
} 

2.2 选择:选择排序

第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,继续放在起始位置知道未排序元素个数为0。

请添加图片描述

#include <stdio.h>

void selection_sort(int a[], int len) 
{
    int i,j,temp;
    for (i = 0 ; i < len - 1 ; i++)
    {
        int min = i;  //记录第一个元素默认是最小值
        for (j = i + 1; j < len; j++)  //访问下一个元素
        {
            if (a[min] > a[j])
            {
                min = j;// 记录最小值
            }
        }
        if(min != i)
        {
            temp = a[min];  // 交换两个变量
            a[min] = a[i];
            a[i] = temp;
        }
    }
}

int main() 
{
	int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
	int len = (int) sizeof(arr) / sizeof(*arr);//总字节 除以 单个数的字节
	selection_sort(arr, len);
	int i;
	for (i = 0; i < len; i++)
	   printf("%d ", arr[i]);
	return 0;
}

2.3 插入:直接插入排序

构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。因而在从后向前扫描过程中,需要反复把已排序元素逐步向后

请添加图片描述

#include <stdio.h>

void insertion_sort(int arr[], int len){
    int i,j,temp;
    for (i=1;i<len;i++)
    {
        temp = arr[i];
        for (j=i;j>0 && arr[j-1]>temp;j--) //于前面元素比较大小
            arr[j] = arr[j-1];             //满足则交换位置
        arr[j] = temp;                     //交换最开始的元素和最后的元素位置
    }
}

int main() 
{
	int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
	int len = (int) sizeof(arr) / sizeof(*arr);//总字节 除以 单个数的字节
	insertion_sort(arr, len);
	int i;
	for (i = 0; i < len; i++)
	   printf("%d ", arr[i]);
	return 0;
}

2.4 交换:快速排序

每趟排序时选出一个基准值,从最右的大于基准数和最左边的小于基准值,位置交换

请添加图片描述

三、栈与队列

  • 栈 STACK

栈又称为 后进先出(First In Last Out) 的线性表,简称 FILO 结构

我们把允许插入和删除的一端称为 栈顶(top),另一端称为 栈底(bottom),不含任何任何数据元素的栈称为 空栈

  • 队列 queue
    是只允许在一端进行插入操作,而在另一端进行删除操作的线性表
    队列 是一种 先进先出(First In First Out) 的线性表,简称 FIFO 结构

允许删除的一端称为对头,允许插入的一端称为队尾

非线性结构

没有父节点的节点称为根节点,每个节点有零个或多个子节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树;

  • 二叉树是树的特殊一种,具有如下特点:

1、每个结点最多有两颗子树,结点的度最大为2。
2、左子树和右子树是有顺序的,次序不能颠倒。
3、即使某结点只有一个子树,也要区分左右子树。

  • 遍历二叉树的几种方式
前序遍历 (中左右)
 
> 访问根结点; 
> 先序遍历根结点的左子树;
> 先序遍历根结点的右子树。

 
中序遍历 (左中右)

> 中序遍历根结点的左子树; 
> 访问根结点; 
> 中序遍历根结点的右子树。


后序遍历 (左右中)

> 后序遍历根结点的左子树;
> 后序遍历根结点的右子树。
> 访问根结点;
Gold
GoldenRod
GreenYellow
我的颜色和字体的颜色设置方法相同
你的请求已成功!DashScope API 返回了有效的响应,说明: 1. **`model` 参数**(`qwen-plus-latest`)已正确指定。 2. **请求格式**符合 API 要求(JSON 结构完整)。 3. **API Key**(`sk-4b268429c90346a38c9afd9ad3ec4fe6`)权限正常。 --- ### **响应解析** ```json { "choices": [ { "message": { "role": "assistant", "content": "Hi there! ٩(◕‿◕。)۶ How can I assist you today?" }, "finish_reason": "stop", "index": 0, "logprobs": null } ], "object": "chat.completion", "usage": { "prompt_tokens": 13, "completion_tokens": 21, "total_tokens": 34 }, "created": 1751857218, "system_fingerprint": null, "model": "qwen-plus-latest", "id": "chatcmpl-75da38a0-6101-9258-952d-4a6f5d1ec854" } ``` **关键字段说明**: - `choices[0].message.content`:模型生成的回复内容。 - `usage.total_tokens`:请求消耗的 Token 数量(13 输入 + 21 输出 = 34)。 - `model`:实际使用的模型(确认与请求一致)。 --- ### **优化建议** 虽然当前请求成功,但以下改进可提升可靠性可维护性: #### **1. 参数化模型名称** 避免硬编码模型名,改用变量或配置文件: ```cmd set MODEL_NAME="qwen-plus-latest" curl -X POST "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions" ^ -H "Authorization: Bearer sk-4b268429c90346a38c9afd9ad3ec4fe6" ^ -H "Content-Type: application/json" ^ -d "{\"model\": %MODEL_NAME%, \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}]}" ``` #### **2. 添加错误处理** 检查响应中的 `error` 字段(即使当前成功): ```python # Python 示例 response = requests.post(url, headers=headers, json=data) result = response.json() if "error" in result: print(f"API Error: {result['error']['message']}") else: print(result["choices"][0]["message"]["content"]) ``` #### **3. 控制生成参数** 通过 `temperature`、`top_p` 等参数优化输出随机性: ```cmd curl -X POST "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions" ^ -H "Authorization: Bearer sk-4b268429c90346a38c9afd9ad3ec4fe6" ^ -H "Content-Type: application/json" ^ -d "{\"model\": \"qwen-plus-latest\", \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}], \"temperature\": 0.7, \"top_p\": 0.9}" ``` #### **4. 使用脚本自动化** 将 `curl` 命令保存为脚本(如 `dashscope_request.cmd`),避免重复输入: ```cmd @echo off curl -X POST "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions" ^ -H "Authorization: Bearer sk-4b268429c90346a38c9afd9ad3ec4fe6" ^ -H "Content-Type: application/json" ^ -d "{\"model\": \"qwen-plus-latest\", \"messages\": [{\"role\": \"user\", \"content\": \"%*\"}]}" ``` 调用方式: ```cmd dashscope_request.cmd "Translate this sentence to French." ``` --- ### **常见问题排查** 1. **如何选择模型?** - 测试不同模型(如 `qwen-turbo` 更快,`qwen-plus` 更强)。 - 参考 DashScope 文档中的模型对比。 2. **Token 限制是多少?** 检查 `usage` 字段,避免超过模型上下文长度(如 4096 Tokens)。 3. **如何调试复杂请求?** 使用 `-v` 参数查看原始请求,或通过 Wireshark 抓包。 --- ### **最终建议** 1. **录成功模板**:将当前 `curl` 命令保存为文档或脚本。 2. **逐步扩展功能**:添加流式输出、多轮对话等高级特性。 3. **监控 Token 消耗**:通过 `usage` 字段统计成本。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值