From c93cfedaf07bfa4f4ade12d76e2fa82d5df4e141 Mon Sep 17 00:00:00 2001 From: Estom Date: Fri, 23 Jul 2021 22:48:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A6=E5=80=BC=E5=8F=B3=E5=80=BC=E5=92=8C?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E8=AF=AD=E4=B9=89=E3=80=81=E8=AE=BA=E6=96=87?= =?UTF-8?q?=E9=98=85=E8=AF=BB=E5=92=8CLeetCode=E5=88=B7=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- C++/面向对象/1 构造函数和析构函数.md | 136 +++++++++-- C++/高级特性/1 C++左值右值.md | 183 +++++++++++++++ C++/高级特性/2 C++移动语义.md | 220 ++++++++++++++++++ C++/高级特性/3 C++完美转发.md | 126 ++++++++++ C++/高级特性/3.cpp | 27 +++ C++/高级特性/image/2021-07-21-11-45-51.png | Bin 0 -> 27166 bytes C++/高级特性/说明.md | 1 + 工作日志/2021年7月18日-今日计划.md | 21 +- 工作日志/2021年7月21日-今日计划.md | 8 + 工作日志/2021年7月22日-今日计划.md | 18 ++ 工作日志/2021年7月23日-今日计划.md | 23 ++ 工作日志/2021年7月9日-七月份安排.md | 17 +- 工作日志/毕业设计.md | 11 +- .../A类:基本算法/5 动态规划——线性动态规划.md | 100 +++++++- .../A类:基本算法/image/2021-07-23-22-46-02.png | Bin 0 -> 5820 bytes .../A类:基本算法/image/2021-07-23-22-46-11.png | Bin 0 -> 5820 bytes 算法/B类:数据结构算法/4.4 线性区间操作.md | 77 ++++++ 算法/B类:数据结构算法/4.5 链表与映射.md | 94 ++++++++ .../image/2021-07-23-13-09-12.png | Bin 0 -> 43232 bytes 读书思考/简介.md | 3 + 20 files changed, 1022 insertions(+), 43 deletions(-) create mode 100644 C++/高级特性/1 C++左值右值.md create mode 100644 C++/高级特性/2 C++移动语义.md create mode 100644 C++/高级特性/3 C++完美转发.md create mode 100644 C++/高级特性/3.cpp create mode 100644 C++/高级特性/image/2021-07-21-11-45-51.png create mode 100644 C++/高级特性/说明.md create mode 100644 工作日志/2021年7月21日-今日计划.md create mode 100644 工作日志/2021年7月22日-今日计划.md create mode 100644 工作日志/2021年7月23日-今日计划.md create mode 100644 算法/A类:基本算法/image/2021-07-23-22-46-02.png create mode 100644 算法/A类:基本算法/image/2021-07-23-22-46-11.png create mode 100644 算法/B类:数据结构算法/4.5 链表与映射.md create mode 100644 算法/B类:数据结构算法/image/2021-07-23-13-09-12.png create mode 100644 读书思考/简介.md diff --git a/C++/面向对象/1 构造函数和析构函数.md b/C++/面向对象/1 构造函数和析构函数.md index 6b9d14ee..44029f89 100644 --- a/C++/面向对象/1 构造函数和析构函数.md +++ b/C++/面向对象/1 构造函数和析构函数.md @@ -1,12 +1,7 @@ # 拷贝控制 -> 目录 -> * 拷贝、赋值与销毁 -> * 拷贝控制和资源管理 -> * 交换操作 -> * 拷贝控制实例 -> * 动态内存管理类 -> * 对象移动 +> 参考文献 +> * [https://www.cnblogs.com/sunchaothu/p/11392116.html](https://www.cnblogs.com/sunchaothu/p/11392116.html) > 类的特殊函数 > * 初始化——构造函数 @@ -14,10 +9,20 @@ > * 移动——移动构造函数 > * 赋值——拷贝赋值运算符、移动赋值运算符 > * 销毁——析构函数 +``` +默认构造(无参)   T() +拷贝构造       T(const T& ) +移动构造       T() + +拷贝赋值       T& operator=(T& ) +移动赋值       T& operator=(T&& ) + +析构         ~T() +``` ## 1 构造函数 -> 与类同名的,没有返回值的函数,用来创建、赋值、移动、销毁该类的对象。 +> 与类同名的,没有返回值的函数,用来创建、拷贝、移动、销毁该类的对象。 ## 1.1 合成构造函数 编译器自动生成的一系列构造函数。包括以下几种 @@ -29,11 +34,11 @@ * 合成析构函数 * 系统自动生成的析构函数。 -## 1.2 默认构造函数 +## 1.2 默认构造函数和普通构造函数 +* 默认构造函数是无参构造函数 +* 普通构造函数是一系列有参数的构造函数。 -无参构造函数。 - -## 1.3 拷贝构造函数 +## 1.3 拷贝构造函数和拷贝赋值运算符 唯一参数是当前类类型,或者当前类型的const引用。 @@ -57,15 +62,88 @@ string nies = string("efji"); * 从一个返回类型为费引用类型的函数返回一个对象 * 用花括号列表初始化一个数组中的元素或一个聚合类中的成员 -### 赋值运算符(拷贝运算符) +### 赋值运算符(拷贝赋值运算符) > 普通赋值的时候,会调用重载的赋值运算符。 * 编译器会自动生成合成拷贝赋值运算符 * 需要重载赋值运算符。 -## 1.4 移动构造函数 +## 1.4 移动构造函数和移动赋值运算符 +* 在面向对象中,有的类是可以拷贝的,例如车、房等他们的属性是可以复制的,可以调用拷贝构造函数,有点类的对象则是独一无二的,或者类的资源是独一无二的,比如 IO 、 std::unique_ptr等,他们不可以复制,但是可以把资源交出所有权给新的对象,称为可以移动的。 +* C++11最重要的一个改进之一就是引入了move语义,这样在一些对象的构造时可以获取到已有的资源(如内存)而不需要通过拷贝,申请新的内存,这样移动而非拷贝将会大幅度提升性能。例如有些右值即将消亡析构,这个时候我们用移动构造函数可以接管他们的资源。 +``` +#include +#include + +using namespace std; + +class A{ +public: + //默认构造函数 + A():i(new int[500]){ + cout<<"class A construct!"< 参考文献 +> * [cnblogs.com/sunchaothu/p/11343517.html](cnblogs.com/sunchaothu/p/11343517.html) + + +> 为了导入右值和移动语义,首先复习了以下临时对象在函数返回值和传参数时构造了几次;然后对比介绍了左值和右值,以及右值引用的形式和含义。为移动语义和完美转发的介绍做铺垫。 +## 1 问题导入 + +C++11 引入了 std::move 语义、右值引用、移动构造和完美转发这些特性。 + + +* 函数返回值是传值的时候发生几次对象构造、几次拷贝? +* 函数的形参是值传递的时候发生几次对象构造? + +### 函数返回值原理 +``` +// main.cpp +#include +using namespace std; + +class A{ +public: + A(){ + cout<<"class A construct!"< 参考文献 +> * [https://www.cnblogs.com/sunchaothu/p/11392116.html](https://www.cnblogs.com/sunchaothu/p/11392116.html) +> * [ +https://stackoverflow.com/questions/3106110/what-are-move-semantics/3109981#3109981]( +https://stackoverflow.com/questions/3106110/what-are-move-semantics/3109981#3109981) + +## 1 可拷贝和可移动的概念 + +* 在面向对象中,有的类是可以拷贝的,例如车、房等他们的属性是可以复制的,可以调用拷贝构造函数和拷贝赋值函数。 +* 有点类的对象则是独一无二的,或者类的资源是独一无二的,比如 IO 、 std::unique_ptr等,他们不可以复制,但是可以把资源交出所有权给新的对象,称为可以移动的,可以调用移动构造函数和移动赋值函数。 +* C++11最重要的一个改进之一就是引入了move语义,这样在一些对象的构造时可以获取到已有的资源(如内存)而不需要通过拷贝,申请新的内存,这样移动而非拷贝将会大幅度提升性能。例如有些右值即将消亡析构,这个时候我们用移动构造函数可以接管他们的资源。 + +## 2 移动构造函数和移动赋值函数 + +```C++ +#include +#include + +using namespace std; + +class A{ +public: + A():i(new int[500]){ + cout<<"class A construct!"< +_NODISCARD constexpr remove_reference_t<_Ty>&& move(_Ty&& _Arg) noexcept { // forward _Arg as movable + return static_cast&&>(_Arg); +} +``` + +可以看到std::move 是一个模板函数,通过remove_reference_t获得模板参数的原本类型,然后把值转换为该类型的右值。用C++大师 Scott Meyers 的在《Effective Modern C++》中的话说, std::move 是个cast ,not a move. + +值得注意的是: 使用move意味着,把一个左值转换为右值,原先的值不应该继续再使用(承诺即将废弃) + +## 4 使用 std::move 实现一个高效的 swap 函数 +我们可以使用 move语义实现一个 交换操作,swap;在不使用 Move 语义的情况下 +``` +swap(A &a1, A &a2){ + A tmp(a1); // 拷贝构造函数一次,涉及大量数据的拷贝 + a1 = a2; // 拷贝赋值函数调用,涉及大量数据的拷贝 + a2 = tmp; // 拷贝赋值函数调用,涉及大量数据的拷贝 +} +``` +如果使用 Move语义,即加上移动构造函数和移动赋值函数: +``` +void swap_A(A &a1, A &a2){ + A tmp(std::move(a1)); // a1 转为右值,移动构造函数调用,低成本 + a1 = std::move(a2); // a2 转为右值,移动赋值函数调用,低成本 + a2 = std::move(tmp); // tmp 转为右值移动给a2 +} +``` +可以看到move语义确实可以提高性能,事实上, move语义广泛地用于标准库的容器中。C++11标准库里的std::swap 也是基于移动语义实现的。 + +说到了 swap, 那就不得不说一下啊 move-and-swap 技术了 + +## 5 Move and swap 技巧 +看下面一段代码,实现了一个 unique_ptr ,和标准的std::unqiue_ptr的含义一致,智能指针的一种。 +```C++ +template +class unique_ptr +{ + T* ptr; + +public: + + + explicit unique_ptr(T* p = nullptr) + { + ptr = p; + } + + ~unique_ptr() + { + delete ptr; + } + + // move constructor + unique_ptr(unique_ptr&& source) // note the rvalue reference + { + ptr = source.ptr; + source.ptr = nullptr; + } + + /* unique_ptr& operator=(unique_ptr&& source) // 这里使用右值引用 + { + if (this != &source) // beware of self-assignment + { + delete ptr; // release the old resource + + ptr = source.ptr; // acquire the new resource + source.ptr = nullptr; + } + return *this; + } */ + + // move and swap idiom replace the move assignment operator + unique_ptr& operator=(unique_ptr rhs) // 这里不用引用,会调用移动构造函数 + { + std::swap(ptr, rhs.ptr); + // std::swap(*this,rhs) // is also ok + return *this; + } + + + + T* operator->() const + { + return ptr; + } + + T& operator*() const + { + return *ptr; + } +}; +``` +在这里如果要按照常规办法写移动赋值函数,函数体内需要写一堆检查自赋值等冗长的代码。使用 move-and-swap语义,只用简短的两行就可以写出来。 在移动赋值函数中 source 是个局部对象,这样在形参传递过来的时候必须要调用拷贝构造函数(这里没有实现则不可调用)或者移动构造函数 +,(事实上仅限右值可以传进来了)。然后 std::swap 负责把原先的资源和source 进行交换,完成了移动赋值。这样写节省了很多代码,很优雅。 + + diff --git a/C++/高级特性/3 C++完美转发.md b/C++/高级特性/3 C++完美转发.md new file mode 100644 index 00000000..a35cec51 --- /dev/null +++ b/C++/高级特性/3 C++完美转发.md @@ -0,0 +1,126 @@ +# 完美转发 + + +## 1 概念 + +首先解释一下什么是完美转发,它指的是函数模板可以将自己的参数“完美”地转发给内部调用的其它函数。所谓完美,即不仅能准确地转发参数的值,还能保证被转发参数的左、右值属性不变。 + +``` +template +void function(T t) { + otherdef(t); +} +``` + +function() 函数模板中调用了 otherdef() 函数。在此基础上,完美转发指的是:如果 function() 函数接收到的参数 t 为左值,那么该函数传递给 otherdef() 的参数 t 也是左值;反之如果 function() 函数接收到的参数 t 为右值,那么传递给 otherdef() 函数的参数 t 也必须为右值。 + + +## 2 C++98实现完美转发 + +* C++98通过左值引用和常量左值引用+函数重载实现完美转发 + +* C++98/03 标准下的 C++ 也可以实现完美转发,只是实现方式比较笨拙。通过前面的学习我们知道,C++ 98/03 标准中只有左值引用,并且可以细分为非 const 引用和 const 引用。其中,使用非 const 引用作为函数模板参数时,只能接收左值,无法接收右值;而 const 左值引用既可以接收左值,也可以接收右值,但考虑到其 const 属性,除非被调用函数的参数也是 const 属性,否则将无法直接传递。 + + +* 如果使用 C++ 98/03 标准下的 C++ 语言,我们可以采用函数模板重载的方式实现完美转发 + + +```C++ +#include +using namespace std; +//重载被调用函数,查看完美转发的效果 +void otherdef(int & t) { + cout << "lvalue\n"; +} +void otherdef(const int & t) { + cout << "rvalue\n"; +} +//重载函数模板,分别接收左值和右值 +//接收右值参数 +template +void function(const T& t) { + otherdef(t); +} +//接收左值参数 +template +void function(T& t) { + otherdef(t); +} +int main() +{ + function(5);//5 是右值 + int x = 1; + function(x);//x 是左值 + return 0; +} +// 程序执行结果为: +// rvalue +// lvalue +``` +从输出结果中可以看到,对于右值 5 来说,它实际调用的参数类型为 const T& 的函数模板,由于 t 为 const 类型,所以 otherdef() 函数实际调用的也是参数用 const 修饰的函数,所以输出“rvalue”;对于左值 x 来说,2 个重载模板函数都适用,C++编译器会选择最适合的参数类型为 T& 的函数模板,进而 therdef() 函数实际调用的是参数类型为非 const 的函数,输出“lvalue”。 + + + +## 3 C++ 11实现完美转发。 + +* C++ 11 标准中允许在函数模板中使用右值引用来实现完美转发 + + +### 万能引用规则 +* C++11 标准中规定,通常情况下右值引用形式的参数只能接收右值,不能接收左值。但对于函数模板中使用右值引用语法定义的参数来说,它不再遵守这一规定,既可以接收右值,也可以接收左值(此时的右值引用又被称为“万能引用”) + + +* 在 C++11 标准中实现完美转发,只需要编写如下一个模板函数即可 +``` +template +void function(T&& t) { + otherdef(t); +} +``` + +### 引用折叠规则 +* 此模板函数的参数 t 既可以接收左值,也可以接收右值。但仅仅使用右值引用作为函数模板的参数是远远不够的,还有一个问题继续解决,即如果调用 function() 函数时为其传递一个左值引用或者右值引用的实参。 + +* C++ 11标准为了更好地实现完美转发,特意为其指定了新的类型匹配规则,又称为引用折叠规则(假设用 A 表示实际传递参数的类型): + * 当实参为左值或者左值引用(A&)时,函数模板中 T&& 将转变为 A&(A& && = A&); + * 当实参为右值或者右值引用(A&&)时,函数模板中 T&& 将转变为 A&&(A&& && = A&&)。 + +``` +int n = 10; +int & num = n; +function(num); // T 为 int& +int && num2 = 11; +function(num2); // T 为 int && +``` +### Foward模板函数 + +* 引入了一个模板函数 forword(),我们只需要调用该函数,将函数模板接收到的形参连同其左、右值属性,一起传递给被调用的函数呢? + +```C++ +#include +using namespace std; +//重载被调用函数,查看完美转发的效果 +void otherdef(int & t) { + cout << "lvalue\n"; +} +void otherdef(const int & t) { + cout << "rvalue\n"; +} +//实现完美转发的函数模板 +template +void function(T&& t) { + otherdef(forward(t)); +} +int main() +{ + function(5); + int x = 1; + function(x); + return 0; +} +// 程序执行结果为: +// rvalue +// lvalue +``` + +* 总的来说,在定义模板函数时,我们采用右值引用的语法格式定义参数类型,由此该函数既可以接收外界传入的左值,也可以接收右值;其次,还需要使用 C++11 标准库提供的 forword() 模板函数修饰被调用函数中需要维持左、右值属性的参数。由此即可轻松实现函数模板中参数的完美转发。 \ No newline at end of file diff --git a/C++/高级特性/3.cpp b/C++/高级特性/3.cpp new file mode 100644 index 00000000..5d7acaa6 --- /dev/null +++ b/C++/高级特性/3.cpp @@ -0,0 +1,27 @@ +#include +using namespace std; +//重载被调用函数,查看完美转发的效果 +void otherdef(int & t) { + cout << "lvalue\n"; +} +void otherdef(const int & t) { + cout << "rvalue\n"; +} +//重载函数模板,分别接收左值和右值 +//接收右值参数。常量左值引用可以接受左值、常量左值、右值、常量右值。 +template +void function(const T& t) { + otherdef(t); +} +//接收左值参数 +template +void function(T& t) { + otherdef(t); +} +int main() +{ + function(5);//5 是右值 + int x = 1; + function(x);//x 是左值 + return 0; +} \ No newline at end of file diff --git a/C++/高级特性/image/2021-07-21-11-45-51.png b/C++/高级特性/image/2021-07-21-11-45-51.png new file mode 100644 index 0000000000000000000000000000000000000000..db5433b1594fb8f3fd172067301ba16155861875 GIT binary patch literal 27166 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 literal 0 HcmV?d00001 diff --git a/C++/高级特性/说明.md b/C++/高级特性/说明.md new file mode 100644 index 00000000..e35df5e7 --- /dev/null +++ b/C++/高级特性/说明.md @@ -0,0 +1 @@ +> 主要用来记录 effectiveC++ 和more effective c++中涉及到的基础知识和高级特性。 \ No newline at end of file diff --git a/工作日志/2021年7月18日-今日计划.md b/工作日志/2021年7月18日-今日计划.md index 6dbefa19..cb81e7a7 100644 --- a/工作日志/2021年7月18日-今日计划.md +++ b/工作日志/2021年7月18日-今日计划.md @@ -3,25 +3,12 @@ * 十篇文章(2021.04文件夹下的内容) * [x] FedFMC * [x] EWC(FedFMC中用到的一种终身学习的方法,需要了解,作为参考文献)是一种增量学习方案 - * [ ] Overcoming Forgetting in Federated Learning on Non-IID Data 利用增量学习方案解决联邦学习中非独立同分布问题的另外一个方法。 - * [ ] Federated Meta-Learning for Fraudulent Credit Card Detection 联邦元学习解决信用卡诈骗检测 + * [x] Overcoming Forgetting in Federated Learning on Non-IID Data 利用增量学习方案解决联邦学习中非独立同分布问题的另外一个方法。 + * [x] Federated Meta-Learning for Fraudulent Credit Card Detection 联邦元学习解决信用卡诈骗检测 * [x] Learning Classifiers When the Training Data Is Not IID - * [ ] on the convergence of fl on noniid data + * [x] on the convergence of fl on noniid data * [x] federated learning with non iid data - * [ ] federated learning on non iid data silos an experiment - * [ ] federated learning with non iid data : a survey - * [ ] fedAT - * [ ] Android Malware Detection using Deep Learning on API Method Sequences - * [ ] LoAdaBoost: loss-based AdaBoost federated machine learning with reduced computational complexity on IID and non-IID intensive care data - * [ ] A scalable and extensible framework for android malware detection and family attribution - * [ ] CTDroid: Leveraging a Corpus of Technical Blogs for Android Malware Analysis - * [ ] Optimizing symbolic execution for malware behavior classification - * [ ] Cross-Gradient Aggregation for Decentralized Learning from Non-IID data - * [ ] Federated Learning on Non-IID Data Silos: An Experimental Study - * [ ] JOWMDroid: Android malware detection based on feature weighting with joint optimization of weight-mapping and classifier parameters - * [ ] Inverse Distance Aggregation for Federated Learning with Non-IID Data - * [ ] DAMBA: Detecting Android Malware by ORGB Analysis - * [ ] DeepIntent: Deep Icon-Behavior Learning for Detecting Intention-Behavior Discrepancy in Mobile Apps + * [x] federated learning with non iid data : a survey ## 总结 diff --git a/工作日志/2021年7月21日-今日计划.md b/工作日志/2021年7月21日-今日计划.md new file mode 100644 index 00000000..1b4cc44e --- /dev/null +++ b/工作日志/2021年7月21日-今日计划.md @@ -0,0 +1,8 @@ +## 计划 + +### 毕设——论文阅读2.00-6.00 +* [x] federated learning on non iid data silos an experiment +* [x] fedAT +* [x] 自适应联邦学习算法 + +## 总结 \ No newline at end of file diff --git a/工作日志/2021年7月22日-今日计划.md b/工作日志/2021年7月22日-今日计划.md new file mode 100644 index 00000000..34b63c39 --- /dev/null +++ b/工作日志/2021年7月22日-今日计划.md @@ -0,0 +1,18 @@ +## 计划 + +### 毕设——论文阅读2.00-6.00 +* [x] mocha 联邦多任务学习 +* [x] Improving Federated Learning Personalization via Model Agnostic Meta Learning +* [x] Personalized Federated Learning for Intelligent IoT Applications: A Cloud-Edge Based Framework +* [x] Personalized Federated Learning With Differential Privacy +* [x] Personalized Federated Learning with Moreau Envelopes +* [x] Personalized Federated Learning: A Meta-Learning Approach +* [x] Salvaging Federated Learning by Local Adaptation +* [x] Survey of Personalization Techniques for Federated Learning + + + +## 总结 + + +* 基本把非独立同分布问题的经典方法看完了。接下来进行复现。尝试对各种方法进行对比,主要是基于手写体数据集构建非独立同分布的实验。然后将数据集更改为自己的数据集(等选择好数据集之后,将数据及进行更换。) \ No newline at end of file diff --git a/工作日志/2021年7月23日-今日计划.md b/工作日志/2021年7月23日-今日计划.md new file mode 100644 index 00000000..f364b056 --- /dev/null +++ b/工作日志/2021年7月23日-今日计划.md @@ -0,0 +1,23 @@ +## 计划 + +### 毕设——论文阅读2.00-6.00 + +* [x] Android Malware Detection using Deep Learning on API Method Sequences +* [x] LoAdaBoost: loss-based AdaBoost federated machine learning with reduced computational complexity on IID and non-IID intensive care data +* [x] A scalable and extensible framework for android malware detection and family attribution +* [x] CTDroid: Leveraging a Corpus of Technical Blogs for Android Malware Analysis +* [x] Optimizing symbolic execution for malware behavior classification +* [x] Cross-Gradient Aggregation for Decentralized Learning from Non-IID data +* [x] JOWMDroid: Android malware detection based on feature weighting with joint optimization of weight-mapping and classifier parameters +* [x] DAMBA: Detecting Android Malware by ORGB Analysis +* [x] DeepIntent: Deep Icon-Behavior Learning for Detecting Intention-Behavior Discrepancy in Mobile Apps + + +### 就业 + +- [x] LeetCode一道困难题。10.00-12.00 +- [ ] C++基础知识看完。8.00-10.00 + + + +## 总结 \ No newline at end of file diff --git a/工作日志/2021年7月9日-七月份安排.md b/工作日志/2021年7月9日-七月份安排.md index 56289942..2be9462e 100644 --- a/工作日志/2021年7月9日-七月份安排.md +++ b/工作日志/2021年7月9日-七月份安排.md @@ -2,13 +2,16 @@ ## 任务 ### 毕设 * 阅读论文(两周)7.16-7.25(每天十篇可能读完!!!) - * 恶意软件相关的论文 - * 联邦学习相关的论文 - * 非独立同分布和半监督学习相关的文章 -* 完成实验(三周)(7.25-8.8) - * 特征提取的实验 - * 联邦学习针对非独立同分布的实验 - * 联邦半监督学习的实验 + * 恶意软件相关的论文(7.30) + * 联邦学习相关的论文(7.25) + * 非独立同分布相关的文章(7.30) + * ~~联邦半监督学习的文章(这一个点确实可以去掉了)~~ +* 完成实验(四周)(7.25-8.8) + * 联邦学习针对非独立同分布(手写体数据实验实现)的实验(一周) + * 恶意软件特征提取的实验(一周) 什么样的数据集?怎样的方法提取特征?提取哪些特征用于实验?使用什么样的模型? + * 联邦学习针对恶意软件数据集的实验。(一周) + * 差分隐私应用的实验(一周) + * ~~联邦半监督学习的实验~~ * 完成小论文(三周) * 一篇关于非独立同分布联邦学习的小实验 * 完成大论文(四周) diff --git a/工作日志/毕业设计.md b/工作日志/毕业设计.md index 541e9eff..3ad8313b 100644 --- a/工作日志/毕业设计.md +++ b/工作日志/毕业设计.md @@ -55,9 +55,14 @@ 2. 联邦半监督学习方案——半监督方案? 3. 联邦非独立同分布学习方案——某一个方案 -论文贡献 -1. 实现以上方法 -2. 实现了仿真系统和实验验证 +论文贡献(到时候再展开或者压缩内容。) +1. 实现了差分隐私,并通过实验验证了差分隐私对参数隐私的保护 +2. ~~实现了半监督学习方案。这个可以去掉,如果最后实现起来比较简单,则可以加上~~ +3. 使用了联邦元学习解决了非独立同分布问题 +4. 一个恶意软件特征提取和分析工具 +5. 完成了相关的实验验证。证明了balabala +6. 构建了联邦学习框架和恶意软件检测系统。能够使用半监督学习,差分隐私保护用户的隐私,能够针对非独立同分布场景,训练机器学习模型。恶意软件检测系统包括特征提取模块和模型检测模块。 +7. 提供了一个训练框架,以及一个可用的模型。 ### 论文结构 diff --git a/算法/A类:基本算法/5 动态规划——线性动态规划.md b/算法/A类:基本算法/5 动态规划——线性动态规划.md index 18458bee..7eb3ec8a 100644 --- a/算法/A类:基本算法/5 动态规划——线性动态规划.md +++ b/算法/A类:基本算法/5 动态规划——线性动态规划.md @@ -121,7 +121,7 @@ public int climbStairs(int n) { ### 算法设计 -* **状态定义**: 设动态规划列表 dpdp ,dp[i]dp[i] 代表以元素 nums[i]nums[i] 为结尾的连续子数组最大和。 +* **状态定义**: 设动态规划列表 dp ,dp[i]dp[i] 代表以元素 nums[i]nums[i] 为结尾的连续子数组最大和。 * 为何定义最大和 dp[i]dp[i] 中必须包含元素 nums[i]nums[i] :保证 dp[i]dp[i] 递推到 dp[i+1]dp[i+1] 的正确性;如果不包含 nums[i]nums[i] ,递推时则不满足题目的 连续子数组 要求。 * **转移方程**: 若 dp[i-1] \leq 0dp[i−1]≤0 ,说明 dp[i - 1]dp[i−1] 对 dp[i]dp[i] 产生负贡献,即 dp[i-1] + nums[i]dp[i−1]+nums[i] 还不如 nums[i]nums[i] 本身大。 * 当 dp[i - 1] > 0dp[i−1]>0 时:执行 dp[i] = dp[i-1] + nums[i]dp[i]=dp[i−1]+nums[i] @@ -183,4 +183,102 @@ public int climbStairs(int n) { } return max; } +``` + + +## 4 传递信息 + +### 问题描述 +小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下: + +有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0 +每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的关系是单向的(比如 A 可以向 B 传信息,但 B 不能向 A 传信息)。 +每轮信息必须需要传递给另一个人,且信息可重复经过同一个人 +给定总玩家数 n,以及按 [玩家编号,对应可传递玩家编号] 关系组成的二维数组 relation。返回信息从小 A (编号 0 ) 经过 k 轮传递到编号为 n-1 的小伙伴处的方案数;若不能到达,返回 0。 + +示例 1: +``` +输入:n = 5, relation = [[0,2],[2,1],[3,4],[2,3],[1,4],[2,0],[0,4]], k = 3 + +输出:3 + +解释:信息从小 A 编号 0 处开始,经 3 轮传递,到达编号 4。共有 3 种方案,分别是 0->2->0->4, 0->2->1->4, 0->2->3->4。 +``` + +### 问题分析 + + +### 策略选择 +* 有三种不同的策略选择:广度优先搜索、深度优先搜索、动态规划。本文采用动态规划的思路,实际上与广度优先搜索的思路是一致的。看在第k步能到达的所有节点。 + +### 算法设计 + + +* **状态定义**dp[j] 为经过 i轮传递到编号j 的玩家的方案数,其中k0≤i≤k,n0≤j>& relation, int k) { + // // 构建邻接矩阵 + // vector> vec(n,vector(n,0)); + // for(auto a:relation){ + // vec[a[0]][a[1]]=1; + + // } + // // for(int i=0;i result; + // result.push_back(0); + // for(int i=0;i temp; + // for(auto a:result){ + // for(int j=0;j dp(n,0); + dp[0]=1; + for(int i=0;i temp(n,0); + for(auto a: relation){ + temp[a[1]]+=dp[a[0]]; + } + dp.assign(temp.begin(),temp.end()); + } + return dp[n-1]; + + } +}; ``` \ No newline at end of file diff --git a/算法/A类:基本算法/image/2021-07-23-22-46-02.png b/算法/A类:基本算法/image/2021-07-23-22-46-02.png new file mode 100644 index 0000000000000000000000000000000000000000..1091299c350f488a8ae64fbe00729af3d3720b33 GIT binary patch literal 5820 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 L)`m4IT1Wj4 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 L)`m4IT1Wj4>& ranges, int left, int right) { + // 一种差分数组的方法。 + vector vec(right-left+2,0); + for(auto k:ranges){ + if(k[0]>right || k[1]right){ + vec[right-left+1]--; + } + else{ + vec[k[1]-left+1]--; + } + } + + int m = 0; + for(int a =left;a<=right;a++){ + m+=vec[a-left]; + if(m<=0){ + return false; + } + } + return true; + + } +}; ``` \ No newline at end of file diff --git a/算法/B类:数据结构算法/4.5 链表与映射.md b/算法/B类:数据结构算法/4.5 链表与映射.md new file mode 100644 index 00000000..a0561dd8 --- /dev/null +++ b/算法/B类:数据结构算法/4.5 链表与映射.md @@ -0,0 +1,94 @@ +# 链表与映射 + + +## 复制带随机指针的链表 + +### 问题描述 + +给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 + +构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。 + +例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。 + +返回复制链表的头节点。 + +用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示: + +val:一个表示 Node.val 的整数。 +random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。 +你的代码 只 接受原链表的头节点 head 作为传入参数。 + +  + +示例 1: + +![](image/2021-07-23-13-09-12.png) +``` +输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] +输出:[[7,null],[13,0],[11,4],[10,2],[1,0]] +``` + +### 问题分析 + +* 需要建立原链表节点到新链表节点的映射。这个映射本可以通过添加子段实现,但是不能添加。只能使用一个map完成链表映射了。 + +### 策略选择 + + + +### 算法设计 + +### 算法分析 + +### 算法实现 + +```C++ +/* +// Definition for a Node. +class Node { +public: + int val; + Node* next; + Node* random; + + Node(int _val) { + val = _val; + next = NULL; + random = NULL; + } +}; +*/ +class Solution { +public: + Node* copyRandomList(Node* head) { + if(head==nullptr)return nullptr; + // 使用vector,修改原链表的方法不行。 + // 使用map建立原链表到新链表的映射 + map m; + Node* old_head = head; + Node* temp_old = head; + Node* new_head = new Node(head->val); + Node* temp_new = new_head; + while(temp_old->next!=nullptr){ + m[temp_old]=temp_new; + temp_new->next = new Node(temp_old->next->val); + + temp_old=temp_old->next; + temp_new=temp_new->next; + + } + m[temp_old]=temp_new; + + temp_old = head; + while(temp_old!=nullptr){ + if(temp_old->random!=nullptr){ + m[temp_old]->random=m[temp_old->random]; + } + temp_old=temp_old->next; + } + + return new_head; + } +}; +``` \ No newline at end of file diff --git a/算法/B类:数据结构算法/image/2021-07-23-13-09-12.png b/算法/B类:数据结构算法/image/2021-07-23-13-09-12.png new file mode 100644 index 0000000000000000000000000000000000000000..73e032fb9f7422d1011209955c44428d21656574 GIT binary patch literal 43232 zcmeFZcT`jD_AaU-s30JS^3f3xqzed03n)mD8mdT@-VrIG1yn>pq$5a;QbUb^bV8Kg zk=}`P3B81n0Lfi^d+*=b``&%WIRBr+7>l*SNX+}rch+Y<((IjFUWz{*Iufd zdSAFe(|Ueg?DT}&UAO@E)lhk4=x@0-cg32)i1=e~i~k1Q`lYv#S0ky(Z-JEd}cj||LV2i|`Z`;sMRK0)Zz z;-1%5;S+83FrIz#+Wv~WKP0DX`{YjG7Az~5^D}={tK95aA8K=>w&4(2-k;>dEId|0 z3STULG&)27o0;wTN{p<_M8{P5d?VvprgyAx`<(Zn0(+dOn6QjPUwsV&1UHA9);A}J zj5I?}qD2}W^6^Q(@SSnt9M0j*)25eUj(!qNW$(n>5QFA8B%BQ`_LrYso>d+9kJ!qH z1yu&+3eAi-={zzb!>?SIpsx^(gw}cmY~IAag+o|!EZ?grfOiB`kk_LEbLNfgVs`4F zBNDNg`G?E%$RIDmdSNP_c0Tx^zlH%97kb*7vMBD%ghHb$Y&)q$>hAIJO=wAvDKXmU zN2VIoGUurQ%ZWJ-CN|Cf0$=g#?xvh%Dz9+%-usAKTS4%dE3y1QfGV{8Yi`84Wx z^-AW~3^Xwf@i}8ZLa}2eGd52@wA&y;4`&LnuIV0){RHjyXrlRCk^6|XQfPTO-SuOL zTjN~ftrC;lZqF>g6)A7{3jE%kfOj2A~|Id zgvU7@|byj2j^X;79On+9uvd3J5JL>Fc;TvD^!!ac`@cqI(&AI!%h1Qbl zaXhbvR<)53ca(BThmLO5($UOQ*6F*mZ?ZewGbNklLt7EO(tgevYuEr=%)NZs$14+S zLh5(If|za4oJVsV{eZo({1@S+t{_NI{QCj-T5tk;LOi5*9(iA5S;V5@l(2ySBnWY5 zmk|{eWsV6%R=j*xtRz%SEE?N7@XxJ0G6EYT4X@uFD}MBpFTr-YFV0AMq{?;XHQHo& zM95;KNLYbdLHoV;`0>6GONd3i*V=eY*hNpn=SiP27Qvt>I@710BuWeK9QB^BFC183 z>VFYkuqp99+QegXv;o}37KD3jL#m#zJRzR!$oXylb@g(C@5bt?eB~Wj)C7y*G;0DS z=a|x3g2M1+l`Vp(DgJIgLp+5em)zXP512_*V6E5RJ0Nz6ZcY|g1RZUABC+GJP-1;3iKwsB$6f1* zZhjJd+kuHO@e^?ihn5_0XShybBUVIaiJB;BehHqq?6^{>BdK1+Q~9OvYoQllu)Rks z9QX`~TNcYoi1101! zF%yii?x}-Ylf32iss~1HnS3N+DM~a!QH5BdzA(^H|Zk(*pop>zO04}zd8#DJ$LEHhP z0eBJm+z<`oYOFhRcyJmDV#OOJbm@&!l|w&QLL|YeQ8F$wHC5VkzGt_1RKRk(=55@ciilE2e4pLDv7c)P>2mf#$YDq& zP!N7O>0q^g#=UlKHcgGVRg0!k+}yP`<}SJbawgdul~8ip!^*E!9*yZSGM6&vLFi5Y zwPV5AW!L`wH1@GWaUGzW;W^0 zv;zanug{%ctBWyR%B6LN-MUUur9Aah>Av7!l$YN=3RSYeuZ*b)jnNfT$fz6HwuShf zA94V2$R>>c??X0_#gI+?)a%%s+t@|#r*(C-McuUb2b3xe3`v&`jVh)v9X`EMRe4FD z>QFB$MdZ^@Lo(A+qU+=LnNip4rdD&hRu>n)feddMs|iK7F1+NSj|#Mx(@uBwEmfb) zzi3Bk!vUmm?0;Vw{-bK@aO4vtdlAJD z{AvG8{syCl9p~1Q4=qpjxG^;S%g9HKJ^>}=9h02R}` z)Wy>V`VFKg|G0EUHJgBZz?gL$jd&*1s{WAq)8o;bG3`0cpA}N9Q%kH2LBRHN#C**K zZpXaKha|A8vSoiL%1vG!vfiS4E&Jp@_7AOls5RP{_TVJp8IM3rs3G-OLR)0<^&zJ| z8NNA@=W#&Ex-Lp@B;9pw8F`r(|4n+Q1in@GvzD(;w`od`)=t zZ|hPX)y;gkm#8UH!Cn5qq3?6Z+568`gSpvGDid$uGVxyu2@2H4H-WV|>prLZO89Fm z`;SZp*j&8q@q_1wg^v+KVcXDE%@rqMDB)^dMZt}|Pd-y*tUhdqG-QV0-uK#7N_U%dF zEj8Op!Wh#Z{rKk#cJbKL_eEsDKXIKNrIyGZ*#Dq~wJZ4Fk4**HI8}`Z-7u`ozDF7r zGV-`Fs>r#ek!v%ZDt`E&ulnB7GTFIuBuPq*UmsujGQ|P;jy(TsGqWmty zK{kp{ZeZckD$oy{7_es~f#K0;?)(jGxwyw{-3*YT$JPzcLC^}2?dt|dn9G$DH=_e> z^~FaIDW38qsi-;xu7r1s2XF74jF*>LFBOC=Bg~JMq0-RPd98Jmz{5Xcua>*^mO9Zn z8jn=%bNUj=?ZiwcLBcn?c^yc^v$ei7Zu=@a{yw2roe#P`luCeG;(rTQL*Bs{Tn5Jl zDvuUk&0)vBhYwzmaOk_=PhR8n^DVi4xKB+Tk5#EEk{bOX5m-bIrTvsXS;FT~Vw6U2 zDsdjD+71R4Lr3A@pdBOxNI8Pj8SD&sdxT7tZYPCH)D^D7sek3I-8W16^h-C#_p$bk z|NgDIbVexRm!|a*tGiL=w!Cp}JSiI-F%L04>5}A%!6!y97I@{h_uQtxdo8`k`sJmk zoYf!KS}{&045yq{I2~<_jF(#4cUI3sPcq)3*QCP(rIy+|#}TG;xoUCIqRsw=S$>rU zy$Qg{2=P+&8f=bg`2bZ?uUfj#nvCb7k_j?oG?^qDGjH-Y>- z2uSykKpK1n{CB$k_e(edd!;4Kh7x{@I^)r8o&+!-*TOD5iGo(n2X?|cCzQL>B!k@9 zp4q8bk_y`XzO}5jBi749*j&OPnomzP2bjc&mEIm_xZ}9_P(E{Wx3vIy@)Dw~6CyTZ z8;u=0@vKc+G%kPU*Afp}%Mv?PoFExwiyyrm!OhpNKXJ_RS@?5ve}CV&^w|)?G2%s7 zAjFxiZlOo>!w0FE!m*0_Dl0KH{=tV!*I}MiU|y;&o7G5r3iP8Q

%;4(a@w2#J^0 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

YGejeg+$@a3h{Y9gmT;?r@ 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 literal 0 HcmV?d00001 diff --git a/读书思考/简介.md b/读书思考/简介.md new file mode 100644 index 00000000..b751406b --- /dev/null +++ b/读书思考/简介.md @@ -0,0 +1,3 @@ +学而不思则罔,思而不学则殆。 + +深刻体会。每天思考一堆东西,沉浸在自己发现的小规律和小感悟当中,实际上,书中早有成套的理论,概括升华了你的结论。仅仅通过个人的无休止的思考得到的知识和觉悟始终是优先的,思而不学则殆,非常关键。以后多读书,在这里整理一下自己的读书笔记吧。 \ No newline at end of file