【React+TypeScript+DeepSeek】穿越时空对话机

引言

在这个数字化的时代,历史学习常常给人一种距离感。教科书中的历史人物似乎永远停留在文字里,我们无法真正理解他们的思想和智慧。如何让这些伟大的历史人物"活"起来?如何让历史学习变得生动有趣?带着这些思考,我们开发了一个简单的"穿越时空对话机"。

源码已经放在最后啦!


人物选择界面:
人物选择界面
聊天界面:
在这里插入图片描述


1. 项目背景

1.1 创意起源

在传统的历史学习中,学生们往往需要通过记忆大量的史实和年代来了解历史。这种学习方式不仅枯燥,而且难以激发学习兴趣。我们注意到:

  • 学生对历史人物的故事最感兴趣
  • 互动式学习效果最好
  • AI技术为教育带来新可能

基于这些观察,我萌生了开发一个能让用户直接与历史人物"对话"的应用的想法。

1.2 项目目标

  1. 教育价值

    • 让历史学习变得生动有趣
    • 深入理解历史人物的思想
    • 培养历史思维能力
  2. 技术创新

    • 运用先进的AI对话技术
    • 打造流畅的用户体验
    • 实现智能的角色扮演
  3. 文化传承

    • 弘扬优秀传统文化
    • 促进文化交流
    • 连接古今智慧

2. 核心功能概述

2.1 人物库设计

我们精心挑选了来自不同时期、不同领域的历史名人:

  1. 中国古代名人

    • 孔子:儒家思想的代表,强调仁义礼智信
    • 诸葛亮:军事谋略家,智慧与忠诚的化身
    • 李白:浪漫主义诗人,豪放不羁的文学天才
    • 苏轼:文学艺术全才,豁达乐观的人生导师
    • 李时珍:医学大师,严谨求实的科学精神
  2. 世界名人

    • 达芬奇:文艺复兴全才,艺术与科学的完美结合
    • 爱因斯坦:现代物理学家,创新思维的代表
    • 莎士比亚:戏剧大师,人性洞察的大师
    • 莫扎特:音乐天才,艺术激情的化身

每个人物都经过精心设计,包括:

  • 详细的背景故事
  • 独特的性格特征
  • 专业领域知识
  • 语言表达风格
  • 典型的思维方式

2.2 对话系统

基于DeepSeek API构建的智能对话系统具有以下特点:

  1. 角色准确性

    • 准确还原历史人物性格
    • 保持语言风格一致性
    • 符合历史背景
  2. 对话智能性

    • 上下文理解能力
    • 灵活的问题处理
    • 深度的知识储备
  3. 交互自然性

    • 流畅的对话节奏
    • 自然的语言表达
    • 适当的情感表现

3. 技术架构

3.1 技术栈选择

我们采用了现代化的技术栈:

  1. 前端技术

    - React 18
    - TypeScript 4.x
    - Vite
    - CSS Modules
    
  2. AI对话引擎

    - DeepSeek API
    - WebSocket
    - Axios
    
  3. 数据存储

    - LocalStorage
    

3.2 系统架构

采用清晰的分层架构:

  1. 表现层

    • 角色选择界面
    • 对话交互界面
    • 用户反馈组件
  2. 业务层

    • 对话管理
    • 角色控制
    • 会话处理
  3. 数据层

    • API通信
    • 本地存储
    • 状态管理

3.3 数据流设计

实现了清晰的单向数据流:

用户输入
状态更新
API请求
响应处理
界面更新

4. DeepSeek API集成

4.1 API配置

const api = axios.create({
  baseURL: 'https://api.deepseek.com/v1',
  headers: {
    'Authorization': `Bearer ${API_KEY}`,
    'Content-Type': 'application/json',
  },
});

4.2 对话生成

export const generateResponse = async (messages: ChatMessage[]) => {
  const response = await api.post('/chat/completions', {
    model: 'deepseek-chat',
    messages,
    temperature: 0.7,
    max_tokens: 1000,
  });
  return response.data.choices[0].message.content;
};

4.3 提示词系统

为每个历史人物设计了专门的提示词模板:

interface HistoricalFigurePrompt {
  id: string;
  name: string;
  period: string;
  description: string;
  avatar: string;
  systemPrompt: string;
  sampleQuestions: string[];
  personality: string;
  background: string;
}

5. 开发规范

5.1 代码规范

  • 使用ESLint进行代码检查
  • 使用Prettier进行代码格式化
  • 遵循TypeScript严格模式
  • 采用函数式编程范式

5.2 命名规范

  • 组件采用大驼峰命名
  • 函数采用小驼峰命名
  • 常量使用大写下划线
  • CSS类名采用kebab-case

5.3 文件组织

src/
├── components/     # 通用组件
├── pages/         # 页面组件
├── services/      # 服务层
├── styles/        # 样式文件

6. 用户界面设计理念

6.1 设计原则

在设计用户界面时,我们遵循以下核心原则:

  1. 简约而不简单

    • 清晰的视觉层次
    • 重点内容突出
    • 减少视觉干扰
  2. 沉浸式体验

    • 符合历史氛围
    • 富有时代特色
    • 细节打造意境
  3. 交互友好

    • 操作直观
    • 反馈及时
    • 引导清晰

6.2 视觉风格

我们采用了现代简约与古典元素相结合的设计风格:

  1. 配色方案

    :root {
      --primary-color: #4A90E2;
      --secondary-color: #F5A623;
      --text-color: #2C3E50;
      --background-color: #F8F9FA;
      --border-color: #E2E8F0;
    }
    
  2. 字体选择

    • 中文:思源宋体
    • 英文:Roboto
    • 代码:JetBrains Mono
  3. 布局网格

    • 基础单位:8px
    • 内容区域最大宽度:1200px
    • 响应式断点:576px、768px、992px、1200px

7. 角色选择页面

7.1 布局设计

角色选择页面采用卡片式布局:

const CharacterSelect: React.FC = () => {
  return (
    <div className="character-select">
      <header className="header">
        <h1>穿越时空</h1>
        <p>与历史对话</p>
      </header>
      <div className="character-grid">
        {historicalFigures.map(figure => (
          <CharacterCard
            key={figure.id}
            figure={figure}
            onClick={() => handleSelect(figure)}
          />
        ))}
      </div>
    </div>
  );
};

7.2 角色卡片设计

每个角色卡片包含:

  1. 视觉元素

    • 头像/形象
    • 姓名/时代
    • 特色标签
    • 简介文字
  2. 交互效果

    .character-card {
      transition: transform 0.3s ease;
      &:hover {
        transform: translateY(-5px);
        box-shadow: 0 10px 20px rgba(0,0,0,0.1);
      }
    }
    
  3. 信息展示

    const CharacterCard: React.FC<Props> = ({ figure }) => (
      <div className="character-card">
        <div className="avatar">{figure.avatar}</div>
        <h3>{figure.name}</h3>
        <p className="period">{figure.period}</p>
        <p className="description">{figure.description}</p>
        <div className="personality-tags">
          {figure.personality.split(',').map(tag => (
            <span className="tag">{tag}</span>
          ))}
        </div>
      </div>
    );
    

8. 对话界面实现

8.1 整体布局

对话界面分为三个主要部分:

  1. 顶部导航

    • 返回按钮
    • 当前角色信息
    • 功能按钮
  2. 对话区域

    • 消息气泡
    • 打字机效果
    • 滚动加载
  3. 输入区域

    • 消息输入框
    • 发送按钮
    • 快捷操作

8.2 消息展示

实现了富有特色的消息气泡:

const MessageBubble: React.FC<Props> = ({ message, isUser }) => (
  <div className={`message ${isUser ? 'user' : 'assistant'}`}>
    <div className="avatar">
      {isUser ? '👤' : selectedFigure.avatar}
    </div>
    <div className="content">
      <div className="bubble">
        {message.content}
      </div>
      <div className="time">
        {formatTime(message.timestamp)}
      </div>
    </div>
  </div>
);

8.3 打字机效果

实现了自然的打字机效果:

const simulateTyping = async (content: string) => {
  await new Promise(resolve => setTimeout(resolve, 500 + Math.random() * 1000));
  return content;
};

8.4 历史记录功能

实现了完整的对话历史管理:

interface ChatHistory {
  characterId: string;
  messages: ChatMessage[];
  lastUpdated: string;
}

export const saveChatHistory = (characterId: string, messages: ChatMessage[]) => {
  try {
    const existingHistory = localStorage.getItem(CHAT_HISTORY_KEY);
    const history = existingHistory ? JSON.parse(existingHistory) : {};
    
    history[characterId] = {
      characterId,
      messages,
      lastUpdated: new Date().toISOString()
    };
    
    localStorage.setItem(CHAT_HISTORY_KEY, JSON.stringify(history));
  } catch (error) {
    console.error('Failed to save chat history:', error);
  }
};

9. 动画效果

9.1 过渡动画

使用CSS transitions实现平滑过渡:

.fade-enter {
  opacity: 0;
  transform: translateY(20px);
}

.fade-enter-active {
  opacity: 1;
  transform: translateY(0);
  transition: opacity 300ms, transform 300ms;
}

.fade-exit {
  opacity: 1;
}

.fade-exit-active {
  opacity: 0;
  transition: opacity 300ms;
}

9.2 加载动画

实现了优雅的加载效果:

.typing-indicator {
  display: flex;
  gap: 4px;
  padding: 8px 12px;
  
  .dot {
    width: 8px;
    height: 8px;
    background: var(--primary-color);
    border-radius: 50%;
    animation: bounce 1.4s infinite ease-in-out;
    
    &:nth-child(1) { animation-delay: -0.32s; }
    &:nth-child(2) { animation-delay: -0.16s; }
  }
}

@keyframes bounce {
  0%, 80%, 100% { transform: scale(0); }
  40% { transform: scale(1); }
}

10. 响应式设计

10.1 媒体查询

实现了完整的响应式布局:

/* 移动端 */
@media (max-width: 576px) {
  .character-grid {
    grid-template-columns: 1fr;
  }
}

/* 平板 */
@media (min-width: 577px) and (max-width: 992px) {
  .character-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

/* 桌面端 */
@media (min-width: 993px) {
  .character-grid {
    grid-template-columns: repeat(3, 1fr);
  }
}

10.2 弹性布局

使用Flexbox实现灵活的布局:

.chat-container {
  display: flex;
  flex-direction: column;
  height: 100vh;
  
  .chat-messages {
    flex: 1;
    overflow-y: auto;
  }
  
  .chat-input {
    padding: 1rem;
    border-top: 1px solid var(--border-color);
  }
}

11. 性能优化

11.1 虚拟滚动

实现了消息列表的虚拟滚动:

import { FixedSizeList } from 'react-window';

const MessageList: React.FC<Props> = ({ messages }) => (
  <FixedSizeList
    height={600}
    itemCount={messages.length}
    itemSize={80}
    width="100%"
  >
    {({ index, style }) => (
      <MessageItem
        message={messages[index]}
        style={style}
      />
    )}
  </FixedSizeList>
);

11.2 防抖处理

对输入和滚动事件进行防抖处理:

const debouncedScroll = debounce(() => {
  const { scrollTop, scrollHeight, clientHeight } = messagesRef.current;
  if (scrollHeight - scrollTop === clientHeight) {
    loadMoreMessages();
  }
}, 200);

11.3 懒加载

实现了图片和组件的懒加载:

const LazyCharacterCard = React.lazy(() => import('./CharacterCard'));

const CharacterGrid = () => (
  <Suspense fallback={<Skeleton />}>
    {figures.map(figure => (
      <LazyCharacterCard
        key={figure.id}
        figure={figure}
      />
    ))}
  </Suspense>
);

12. 性能优化策略

12.1 代码层面优化

12.1.1 React优化
  1. 组件优化
// 使用React.memo避免不必要的重渲染
const MessageBubble = React.memo<Props>(({ message, isUser }) => {
  return (
    <div className={`message ${isUser ? 'user' : 'assistant'}`}>
      {/* 消息内容 */}
    </div>
  );
});

// 使用useCallback优化事件处理函数
const handleSendMessage = useCallback(() => {
  // 处理发送消息
}, [dependencies]);
  1. 状态管理优化
// 使用useReducer处理复杂状态
const [state, dispatch] = useReducer(chatReducer, initialState);

// 分离状态逻辑
const chatReducer = (state, action) => {
  switch (action.type) {
    case 'ADD_MESSAGE':
      return {
        ...state,
        messages: [...state.messages, action.payload]
      };
    case 'CLEAR_HISTORY':
      return {
        ...state,
        messages: []
      };
    default:
      return state;
  }
};
12.1.2 资源加载优化
  1. 代码分割
// 路由级别的代码分割
const ChatInterface = lazy(() => import('./pages/ChatInterface'));
const CharacterSelect = lazy(() => import('./pages/CharacterSelect'));

// 组件级别的代码分割
const MarkdownRenderer = lazy(() => import('./components/MarkdownRenderer'));
  1. 资源预加载
// 预加载关键资源
const prefetchResources = () => {
  const links = [
    { rel: 'prefetch', href: '/assets/fonts/main.woff2' },
    { rel: 'preload', href: '/assets/images/sprites.png', as: 'image' }
  ];
  
  links.forEach(link => {
    const linkElement = document.createElement('link');
    Object.assign(linkElement, link);
    document.head.appendChild(linkElement);
  });
};

12.2 网络优化

12.2.1 API请求优化
  1. 请求缓存
const cache = new Map();

const cachedFetch = async (url: string) => {
  if (cache.has(url)) {
    return cache.get(url);
  }
  
  const response = await fetch(url);
  const data = await response.json();
  cache.set(url, data);
  
  return data;
};
  1. 请求合并
const batchRequest = async (requests: Request[]) => {
  const batchId = generateBatchId();
  return await api.post('/batch', {
    batchId,
    requests
  });
};
12.2.2 WebSocket优化
class WebSocketManager {
  private ws: WebSocket;
  private reconnectAttempts = 0;
  private maxReconnectAttempts = 5;
  
  constructor(url: string) {
    this.ws = new WebSocket(url);
    this.setupEventHandlers();
  }
  
  private setupEventHandlers() {
    this.ws.onclose = () => {
      if (this.reconnectAttempts < this.maxReconnectAttempts) {
        setTimeout(() => this.reconnect(), 1000 * Math.pow(2, this.reconnectAttempts));
      }
    };
  }
  
  private reconnect() {
    this.reconnectAttempts++;
    // 重新连接逻辑
  }
}

12.3 存储优化

12.3.1 本地存储优化
  1. 数据压缩
import { compress, decompress } from 'lz-string';

const saveCompressedData = (key: string, data: any) => {
  const compressed = compress(JSON.stringify(data));
  localStorage.setItem(key, compressed);
};

const loadCompressedData = (key: string) => {
  const compressed = localStorage.getItem(key);
  if (!compressed) return null;
  return JSON.parse(decompress(compressed));
};
  1. 存储管理
class StorageManager {
  private maxSize = 5 * 1024 * 1024; // 5MB
  
  async cleanup() {
    const items = { ...localStorage };
    const totalSize = Object.values(items)
      .reduce((size, item) => size + item.length, 0);
    
    if (totalSize > this.maxSize) {
      // 清理最旧的数据
      const oldestKey = this.findOldestKey();
      localStorage.removeItem(oldestKey);
    }
  }
}

13. 用户体验优化

13.1 交互优化

13.1.1 输入优化
  1. 智能提示
const AutoComplete: React.FC<Props> = ({ suggestions, onSelect }) => {
  return (
    <div className="autocomplete">
      {suggestions.map(suggestion => (
        <div
          key={suggestion.id}
          className="suggestion"
          onClick={() => onSelect(suggestion)}
        >
          {suggestion.text}
        </div>
      ))}
    </div>
  );
};
  1. 输入防抖
const useDebounce = (value: string, delay: number) => {
  const [debouncedValue, setDebouncedValue] = useState(value);
  
  useEffect(() => {
    const handler = setTimeout(() => {
      setDebouncedValue(value);
    }, delay);
    
    return () => {
      clearTimeout(handler);
    };
  }, [value, delay]);
  
  return debouncedValue;
};

13.2 动画优化

13.2.1 性能优化的动画
.optimized-animation {
  will-change: transform;
  transform: translateZ(0);
  backface-visibility: hidden;
}

@keyframes smooth-entrance {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
13.2.2 动画管理
class AnimationManager {
  private animations: Map<string, Animation> = new Map();
  
  register(id: string, animation: Animation) {
    this.animations.set(id, animation);
  }
  
  play(id: string) {
    const animation = this.animations.get(id);
    if (animation) {
      animation.play();
    }
  }
  
  pause(id: string) {
    const animation = this.animations.get(id);
    if (animation) {
      animation.pause();
    }
  }
}

结语

"穿越时空对话机"探索了如何将先进的AI技术与教育需求相结合的可能性。通过这个项目,我们不仅实现了有趣的历史对话功能,也积累了宝贵的技术经验。

未来,我们将继续优化和扩展这个项目,让更多人能够通过这种创新的方式学习历史、感受文化。我们相信,技术的进步将为教育带来更多可能性。


Gitee源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948359.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang学习历程【第五篇 复合数据类型:数组切片】

Golang学习历程【第五篇 复合数据类型&#xff1a;数组&切片】 1. 数组&#xff08;Array&#xff09;1.1 数组的定义1.2 初始化数组1.3 数据的循环遍历1.4 多维数组 2. 切片&#xff08;Slice&#xff09;2.1 切片声明、初始化2.2 基于数组创建切片2.2 切片的长度(len)和容…

ESP32自动下载电路分享

下面是一个ESP32系列或者ESP8266等电路的一个自动下载电路 在ESP32等模块需要烧写程序的时候&#xff0c;需要通过将EN引脚更改为低电平并将IO0引脚设置为低电平来切换到烧写模式。 有时候也会采用先将IO接到一个按键上&#xff0c;按住按键拉低IO0的同时重新上电的方式进入烧写…

【OceanBase】使用 Superset 连接 OceanBase 数据库并进行数据可视化分析

文章目录 前言一、前提条件二、操作步骤2.1 准备云主机实例2.2 安装docker-compose2.3 使用docker-compose安装Superset2.3.1 克隆 Superset 的 GitHub 存储库2.3.2 通过 Docker Compose 启动 Superset 2.4 开通 OB Cloud 云数据库2.5 获取连接串2.6 使用 Superset 连接 OceanB…

联发科MTK6771/MT6771安卓核心板规格参数介绍

MT6771&#xff0c;也被称为Helio P60&#xff0c;是联发科技(MediaTek)推出的一款中央处理器(CPU)芯片&#xff0c;可运行 android9.0 操作系统的 4G AI 安卓智能模块。MT6771芯片采用了12纳米工艺制造&#xff0c;拥有八个ARM Cortex-A73和Cortex-A53核心&#xff0c;主频分别…

修复 ITunes 在 Windows 或 Mac 上不断崩溃的问题 [100% 有效]

对于 iDevice 用户来说&#xff0c;只能通过 iTunes 在 iDevice 和计算机之间传输文件的困境一直是一个紧迫的问题。所有 iPhone 用户可能都知道&#xff0c;iTunes 并不是一款高效的应用程序&#xff0c;有时性能会很差&#xff0c;例如在 iDevices 和计算机之间传输文件时不断…

【AI大模型】深入GPT-2模型细节:揭秘其卓越性能的秘密

目录 &#x1f354; GPT2的架构 &#x1f354; GPT2模型的细节 2.1 模型过程 2.2 GPT2工作细节探究 &#x1f354; 小结 学习目标 掌握GPT2的架构掌握GPT2的训练任务和模型细节 &#x1f354; GPT2的架构 从模型架构上看, GPT2并没有特别新颖的架构, 它和只带有解码器模块…

C语言 - 理解函数栈帧

一&#xff1a;概述 函数栈帧是函数调用过程中为管理和存储函数相关信息&#xff08;如局部变量、返回地址等&#xff09;而在栈上分配的一块内存区域。它是实现函数调用、递归和返回的关键机制。 二&#xff1a;栈帧的组成 一个典型的栈帧通常包含以下内容&#xff08;从高地…

windows终端conda activate命令行不显示环境名

问题&#xff1a; 始终不显示环境名 解决 首先需要配置conda的环境变量 确保conda --version能显示版本 然后对cmd进行初始化&#xff0c;如果用的是vscode中的终端&#xff0c;那需要对powershell进行初始化 Windows CMD conda init cmd.exeWindows PowerShell conda …

检索增强生成 和思维链 结合: 如何创建检索增强思维链 (RAT)?

论文地址&#xff1a;https://arxiv.org/pdf/2403.05313 Github地址&#xff1a;https://github.com/CraftJarvis/RAT 想象一下&#xff0c;一个人工智能助手可以像莎士比亚一样写作&#xff0c;像专家一样推理。这听起来很了不起&#xff0c;对吧&#xff1f;但是&#xff0…

Fabric链码部署测试

参考链接&#xff1a;运行 Fabric 应用程序 — Hyperledger Fabric Docs 主文档 (hyperledger-fabric.readthedocs.io) &#xff08;2&#xff09;fabric2.4.3部署运行自己的链码 - 知乎 (zhihu.com) Fabric2.0测试网络部署链码 - 辉哥哥~ - 博客园 (cnblogs.com) 1.启动测试…

如何单独安装 MATLAB 工具箱

很多时候由于 MATLAB 太大而选择安装一些 Toolbox&#xff0c;但用着用着发现要用到某个没有安装的 Toolbox&#xff0c;这时候就需要再单独安装这个 Toolbox&#xff0c;下面提供两种方法。 本文以安装 系统辨识工具箱 System Identification Toolbox 为例。 方法一&#xf…

Anaconda/Pytorch/PyCharm/Jupyter安装及使用

1.ANACONDA安装 Anaconda 是全球领先的数据科学与机器学习平台&#xff0c;专为开发者、数据分析师设计。通过 Anaconda&#xff0c;您可以轻松管理数据环境、安装依赖包&#xff0c;快速启动数据分析、机器学习项目。 丰富的 Python 数据科学库&#xff1a;Anaconda 集成了常…

RocketMQ消费者如何消费消息以及ack

1.前言 此文章是在儒猿课程中的学习笔记&#xff0c;感兴趣的想看原来的课程可以去咨询儒猿课堂 这篇文章紧挨着上一篇博客来进行编写&#xff0c;有些不清楚的可以看下上一篇博客&#xff1a; https://blog.csdn.net/u013127325/article/details/144934073 2.broker是如何…

【Logstash02】企业级日志分析系统ELK之Logstash 输入 Input 插件

Logstash 使用 Logstash 命令 官方文档 https://www.elastic.co/guide/en/logstash/current/first-event.html #各种插件 https://www.elastic.co/guide/en/logstash/current/input-plugins.html https://www.elastic.co/guide/en/logstash/current/filter-plugins.html htt…

【设计模式】 基本原则、设计模式分类

设计模式 设计模式是软件工程中的一种通用术语&#xff0c;指的是针对特定问题的经过实践验证的解决方案。设计模式并不是最终的代码实现&#xff0c;而是描述了如何解决某一类问题的思路和方法。 如果熟悉了设计模式&#xff0c;当遇到类似的场景&#xff0c;我们可以快速地…

【AI学习】Transformer深入学习(二):从MHA、MQA、GQA到MLA

前面文章&#xff1a; 《Transformer深入学习&#xff08;一&#xff09;&#xff1a;Sinusoidal位置编码的精妙》 一、MHA、MQA、GQA 为了降低KV cache&#xff0c;MQA、GQA作为MHA的变体&#xff0c;很容易理解。 多头注意力&#xff08;MHA&#xff09;&#xff1a; 多头注…

【DevOps】Jenkins部署

Jenkins部署 文章目录 Jenkins部署资源列表基础环境一、部署Gilab1.1、安装Gitlab1.2、修改配置文件1.3、加载配置文件1.4、访问Gitlab1.5、修改root登录密码1.6、创建demo测试项目1.7、上传代码1.8、验证上传的代码 二、部署Jenkins所需软件2.1、部署JDK2.2、部署Tomcat2.3、部…

Node.js - 文件操作

1. 文件写入 文件写入是计算机非常常见的操作&#xff0c;下载文件&#xff0c;安装软件&#xff0c;保存程序日志&#xff0c;视频录制等都使用到了 1.1 异步写入 const fs require("fs");// 写入文件 fs.writeFile(./sentence.txt, "Hello world", e…

数据结构复习 (顺序查找,对半查找,斐波那契查找,插值查找,分块查找)

查找&#xff08;检索&#xff09;&#xff1a; 定义&#xff1a;从给定的数据中找到对应的K 1&#xff0c;顺序查找&#xff1a; O(n)的从前向后的遍历 2&#xff0c;对半查找&#xff0c;要求有序 从中间开始查找&#xff0c;每次检查中间的是否正确&#xff0c;不正确就…

kafka使用以及基于zookeeper集群搭建集群环境

一、环境介绍 zookeeper下载地址&#xff1a;https://zookeeper.apache.org/releases.html kafka下载地址&#xff1a;https://kafka.apache.org/downloads 192.168.142.129 apache-zookeeper-3.8.4-bin.tar.gz kafka_2.13-3.6.0.tgz 192.168.142.130 apache-zookee…