<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Konquerx的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Konquerx</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Konquerx]]></copyright><item><title><![CDATA[算法导论16章贪心算法习题活动教室分配问题（区间图着色问题）分析详解与代码实现]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/134018504</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/134018504</guid><author>Konquerx</author><pubDate>Tue, 24 Oct 2023 20:32:25 +0800</pubDate><description><![CDATA[算法导论 贪心算法 区间图着色问题  活动教室分配 详解 实现 具体代码 详细代码]]></description><category></category></item><item><title><![CDATA[算法导论（第三版）CH15-动态规划习题15-10投资策略规划题目实现详解（附代码）]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/132496432</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/132496432</guid><author>Konquerx</author><pubDate>Fri, 25 Aug 2023 16:37:07 +0800</pubDate><description><![CDATA[在算法导论（第三版）第15章动态规划最后的习题中，有一道15-10投资策略规划的题目，网上相关的讲解不是很多，或者算法的时间复杂度也较高，因此将具体实现分享如下。]]></description><category></category></item><item><title><![CDATA[Cargo包管理器的简单介绍]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/132473479</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/132473479</guid><author>Konquerx</author><pubDate>Thu, 24 Aug 2023 14:28:07 +0800</pubDate><description><![CDATA[Rust 语言中的 Cargo 是其包管理器，它用于管理 Rust 项目中的依赖关系、构建和发布等任务。Cargo作为Rust的官方的包管理器，为Rust的项目构建、流行起到了不可替代的作用，也为Rust编程、工程管理提供了极大的帮助和便利性。在安装 Rust 的同时，Cargo 会被自动安装。]]></description><category></category></item><item><title><![CDATA[Rust的第一个程序：“Hello World”]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/132473105</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/132473105</guid><author>Konquerx</author><pubDate>Thu, 24 Aug 2023 14:17:24 +0800</pubDate><description><![CDATA[所有编程语言的学习，第一个程序都是"Hello World"，我们也从"Hello World"开始。]]></description><category></category></item><item><title><![CDATA[Rust的安装]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/132472913</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/132472913</guid><author>Konquerx</author><pubDate>Thu, 24 Aug 2023 14:04:17 +0800</pubDate><description><![CDATA[Rust 是一种编程语言，它的设计目标是提供安全、并发、高效的编程体验。要开始使用 Rust，您需要在您的计算机上安装它。以下是在 Windows、Linux 和 macOS 上安装 Rust 的步骤。以上就是在 Windows、Linux 和 macOS 上安装 Rust 的步骤。希望这可以帮助您开始使用这种编程语言。下载并安装 Homebrew。这是一个包管理器，它将帮助您安装 Rust。现在，您可以开始编写 Rust 程序了。现在，您可以开始编写 Rust 程序了。输入您的密码，然后继续安装。]]></description><category></category></item><item><title><![CDATA[初识Dart语言]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/132453008</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/132453008</guid><author>Konquerx</author><pubDate>Wed, 23 Aug 2023 15:10:00 +0800</pubDate><description><![CDATA[总之，Dart是一种功能强大且易于使用的编程语言，适用于Web开发、桌面应用、移动应用和服务器端开发等多个领域。它的简单易学、性能优异和易于调试等特点使得开发者能够更加高效地构建各种类型的应用程序。随着Dart社区的不断壮大和更多企业的支持，Dart将会成为一种越来越受欢迎的编程语言。Dart是Google开发的一种静态类型、编译到JavaScript的Web编程语言。Dart语言的设计目标是解决现代Web开发中遇到的一些挑战，如代码复杂性、性能问题以及跨浏览器兼容性等。Dart编程语言简介。]]></description><category></category></item><item><title><![CDATA[为什么要学习数据结构和算法]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/132447386</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/132447386</guid><author>Konquerx</author><pubDate>Wed, 23 Aug 2023 10:53:33 +0800</pubDate><description><![CDATA[数据结构的作用是帮助人们更好地组织和管理数据，使数据的访问、修改和操作更为高效和方便。算法是计算机科学的基础，用于解决许多不同的问题，例如排序、搜索、图形处理、人工智能等等。对计算科学的发展有重要作用：数据结构是计算机科学的一个重要分支，为计算科学的发展提供了坚实的理论基础和技术支持。方便代码维护和开发：良好的数据结构可以使代码的可读性、可维护性和可扩展性更好，从而方便代码的开发和维护。更好地满足需求：不同的数据结构适用于不同的场景和需求，选择合适的数据结构可以更好地满足问题需要。一、什么是数据结构？]]></description><category></category></item><item><title><![CDATA[初识Rust语言]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/132447235</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/132447235</guid><author>Konquerx</author><pubDate>Wed, 23 Aug 2023 10:42:36 +0800</pubDate><description><![CDATA[生命周期参数化的类型（Lifetime Parameterized type）：Rust允许将生命周期作为泛型参数，以此来保证引用的有效性。生命周期参数化的类型是Rust中的高级特性，用于处理复杂的数据结构和算法。Trait：Trait是Rust中的一种抽象类型，类似于其他语言中的接口。生命周期（Lifetime）：Rust要求在编译时验证所有借用的合法性，因此需要标识出每个变量的生命周期。模式匹配（Pattern Matching）：模式匹配是Rust中的重要特性，它允许匹配值的模式并执行相应操作。]]></description><category></category></item><item><title><![CDATA[巧妙求解最长单调递增子序列LIS序列本身的O(nlogn)的代码实现]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/130583906</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/130583906</guid><author>Konquerx</author><pubDate>Tue, 09 May 2023 18:13:07 +0800</pubDate><description><![CDATA[如何求解最长单调递增子序列LIS序列本身？最长单调递增子序列的长度好求，网上比比皆是，但求LIS本身的值或每个元素的位置索引呢？]]></description><category></category></item><item><title><![CDATA[Rust学习笔记（16）——单向链表之四：链表的遍历和反转]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/115528519</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/115528519</guid><author>Konquerx</author><pubDate>Thu, 08 Apr 2021 19:36:15 +0800</pubDate><description><![CDATA[前几篇学习了插入和删除等操作，再尝试实现一下遍历和翻转。

一、遍历

遍历的实现比较简单，从头节点开始逐个后移即可。下面是一个比较简单的实现，只是依次打印出节点的值。


impl BoxedLinkedList {
    fn traverse(&amp;self) {
        let mut curr = self.head.as_ref();
        while curr.is_some() {
            print!("{:?}\t", curr.unwrap().]]></description><category></category></item><item><title><![CDATA[Rust学习笔记（15）——struct、Option和Box组合应用实现单向链表之三]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/115525348</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/115525348</guid><author>Konquerx</author><pubDate>Thu, 08 Apr 2021 18:00:18 +0800</pubDate><description><![CDATA[本次学习实现链表中间的插入和删除。插入按照从小到大的顺序插入，删除则为找到要删除的值，删除节点。

一、插入

首先我们假设链表是有序的。插入的值为value，插入操作也是从头开始向后遍历链表，找到符合以下条件的节点curr：

curr.val &lt; value；
	curr.next.val &gt;= value;
要考虑几种特殊情况：

链表为空；
	插入的值小于头结点的值；
	插入的值大于尾节点的值；
实现代码如下：


impl BoxedLinkedList {
    fn inser.]]></description><category></category></item><item><title><![CDATA[Rust学习笔记（14）——struct、Option和Box组合应用实现单向链表之二]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/115518486</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/115518486</guid><author>Konquerx</author><pubDate>Thu, 08 Apr 2021 14:46:59 +0800</pubDate><description><![CDATA[在上一篇学习了链表的头部插入和删除，今天尝试一下尾部的插入和删除。

一、尾部插入

在链表的尾部插入，分几种情况：

链表为空：直接将头指针指向新节点；否则进入第二步：
	从头结点开始向后一直找到尾节点，将新节点挂到尾节点上。
实现时的与C的区别在于向后的遍历找到尾部节点，因为所有权的限制，不能像C语言那样写：


curr = curr-&gt;next;

完整代码如下：


impl BoxedLinkedList {
    fn push_back(&amp;mut self, value: i]]></description><category></category></item><item><title><![CDATA[Rust学习笔记（13）——struct、Option和Box组合应用实现单向链表]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/115489664</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/115489664</guid><author>Konquerx</author><pubDate>Wed, 07 Apr 2021 18:39:04 +0800</pubDate><description><![CDATA[前面深入学习了struct、Option和Box的所有权约束及各种场景的使用，现在用struct、Option和Box组合来实现一个单向链表，并实现链表常见的头部插入、删除，尾部插入、删除，中间插入、删除，链表反转，遍历等操作。

一、链表和节点定义

为了方便演示，我们先定义节点，以及节点的new 和link操作，然后再定义一个链表结构体，其中仅有一个头指针成员。

1.1 先定义节点及节点的new / link 操作


#[derive(Debug)]
struct Node {
    val: i]]></description><category></category></item><item><title><![CDATA[Rust学习笔记（12）——Box智能指针]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/115480957</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/115480957</guid><author>Konquerx</author><pubDate>Wed, 07 Apr 2021 12:55:19 +0800</pubDate><description><![CDATA[在rust编程语言的官方介绍中，对于Box智能指针介绍比较简单，只说其可以包裹一个变量，将变量存在堆上，Box中包含堆上的地址。同时Box指针实现了自动解引用trait。在实际操作中，也确实类似，对其操作与对普通类型操作类似，支持连续引用和解引用，在编译器不能自动解引用时，需要手动解引用。

Box指针看似简单，实际上在复杂的应用场景中也有很多情况，我们从简单变量的指针开始。

一、简单变量的指针操作

对于简单变量，操作可以如下：（例子-1）


fn main() {
    let m...]]></description><category></category></item><item><title><![CDATA[Rust学习笔记（11）——Option和struct组合带来的所有权问题及总结]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/115473314</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/115473314</guid><author>Konquerx</author><pubDate>Tue, 06 Apr 2021 23:21:44 +0800</pubDate><description><![CDATA[在上一篇的基础上，我们加一层Option的包裹。还是先定义struct：


#[derive(Debug)]
struct Point {
    x: Box&lt;i32&gt;,
    y: i32,
}

下列代码不可编译：


fn main() {
    let a = Some(Point {
        x: Box::new(5),
        y: 5,
    });
    let b = a.as_ref();
    let c = b.unwrap();
    ]]></description><category></category></item><item><title><![CDATA[Rust学习笔记（10）——引用和解引用的所有权问题]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/115471456</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/115471456</guid><author>Konquerx</author><pubDate>Tue, 06 Apr 2021 22:25:38 +0800</pubDate><description><![CDATA[先定义一个struct如下：


#[derive(Debug)]
struct Point {
    x: i32,
    y: i32,
}

但我们从最简单的类型开始。我们知道对于简单类型来说，其值是可以copy的，所以下方代码没有任何问题：


fn main() {
    let a = 5;
    let b = &amp;a;
    let mut c = *b; // copy '*b' to c; So c's value is 5.

    c += 10;

    pri]]></description><category></category></item><item><title><![CDATA[Rust学习笔记（9）——Option的几个方法及所有权问题]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/115394598</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/115394598</guid><author>Konquerx</author><pubDate>Tue, 06 Apr 2021 16:43:20 +0800</pubDate><description><![CDATA[在rust的设计中，Option的设计非常巧妙，避免了其它语言中常见的Null引起的各种错误和异常。但Option与所有权的结合，尤其是在一些特定的数据结构，如链表、图等设计中，加上引用的各种约束，就使得Option的使用变得复杂起来。

1、unwrap方法

在确认Option不为None的情况下，可以用unwrap方法拆解出其中的值，并获取值的所有权。这里要强调的是，unwrap会消费Option本身的值，后面就不能再用了。


    let a = Some(Box::new(5));
    l]]></description><category></category></item><item><title><![CDATA[Rust学习笔记（8）——连续引用的约束和限制]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/115392685</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/115392685</guid><author>Konquerx</author><pubDate>Fri, 02 Apr 2021 10:47:46 +0800</pubDate><description><![CDATA[为了彻底弄明白所有权和引用的约束，再试试连续引用的一些特殊情况。结构体：


#[derive(Debug)]
struct Point {
    x: Box&lt;i32&gt;,
    y: Box&lt;i32&gt;,
    z: i32,
}

1、先看第一种一般情况，连续不可变引用，可以编译运行：


fn main() {
    let a = Point {
        x: Box::new(3),
        y: Box::new(4),
        z: 5,
]]></description><category></category></item><item><title><![CDATA[Rust学习笔记（7）——引用情况下Vec和数组中所有权的问题]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/115387444</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/115387444</guid><author>Konquerx</author><pubDate>Thu, 01 Apr 2021 23:35:45 +0800</pubDate><description><![CDATA[关于Vec和数组中变量的所有权，以及被引用情况下的所有权，下面的代码基本涵盖了主要的场景，可编译通过，不做解释了：


fn main() {
    let mut a = vec![Box::new(1), Box::new(2)];

    let mut b = &amp;mut a;
    // a[0] = Box::new(10);
    b[0] = Box::new(10);

    let c = &amp;mut b;
    c[0] = Box::new(20);
    ]]></description><category></category></item><item><title><![CDATA[Rust学习笔记（6）——引用情况struct中所有权的转移问题]]></title><link>https://blog.youkuaiyun.com/Konquerx/article/details/115375453</link><guid>https://blog.youkuaiyun.com/Konquerx/article/details/115375453</guid><author>Konquerx</author><pubDate>Thu, 01 Apr 2021 22:58:29 +0800</pubDate><description><![CDATA[还是先定义struct：


#[derive(Debug)]
struct Point {
    x: Box&lt;i32&gt;,
    y: Box&lt;i32&gt;,
    z: i32,
}

通过可变引用，可以改变成员的值，与结构体成员为简单的i32类型一致，除了不能对Box类型使用 “+=”符号以外。


fn main() {
    let mut a = Point {
        x: Box::new(3),
        y: Box::new(4),
     ]]></description><category></category></item></channel></rss>