图综述
A Comprehensive Survey on Graph Neural Networks
文献地址
摘要
传统深度学习任务中的数据通常在欧几里德空间中表示。然而越来越多的数据从非欧几里得域生成,并表示为具有复杂关系和对象之间相互依赖关系的图形。图数据的复杂性给现有的机器学习算法带来了重大挑战。
提出了新的分类方法,将最先进的GNN模型分为四类:递归图神经网络(RecGNNs)、卷积图神经网络(ConvGNNs)、图自动编码器(GAEs)和时空图神经网络(STGNNs)。
探讨了GNN在各种领域中的应用,如推荐系统、化学分子分析和引文网络分类。
总结了开源代码、基准数据集和模型评估方法。
提出了GNN领域的潜在研究方向,如模型深度、可扩展性、异质性和动态性等。
简介深度学习在欧几里得空间成功深度学习在图像分类、视频处理、语音识别和自然语言理解等领域的成功,这些领域的数据通常表示在欧几里得空间中。然而,越来越多的应用中,数据来自非欧几里得领域,并表示为图,这些图数据具有复杂的关系和依赖性。这种复杂性对现有的机器学习算法提出了重大挑战。
图数据的复杂性与欧几里得数据不同,图数据是非结构 ...
代码随想录day14 || 二叉树2
226.翻转二叉树 (优先掌握递归)题目链接思路:交换每个节点的左右子树即可,尝试使用递归法
递归法提示:递归三部曲
1.确定递归函数的参数和返回值
TreeNode* invertTree(TreeNode* root)
2.确定终止条件
if(root == NULL) return root;
3.确定单层递归的逻辑
123swap(root->left,root->right);intvertTree(root->left);invertTree(root->right);
代码如下:
123456789class Solution {public: TreeNode* invertTree(TreeNode* root){ if(root == NULL) return root; swap(root->left,root->right); intvertTree(root->left); invertTree(root->right); return r ...
代码随想录day13 || 二叉树1
二叉树的定义123456struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};
二叉树的递归遍历写递归需按照这三要素来写:
确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
前序遍历:
123456void traversal(TreeNode* cur, vector<int>& vec) { ...
代码随想录day11 || 栈与队列2
150. 逆波兰表达式求值题目链接状态:错一次错误原因:stoi不会使用
1234567891011121314151617181920212223242526272829class Solution {public: int evalRPN(vector<string>& tokens) { stack<int> st; int a, b; for (int i = 0; i < tokens.size(); i++) { if (!st.empty() && (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/")) { b = st.top(); ...
代码随想录day10 || 栈与队列1
介绍栈和队列是STL(C++标准库)里面的两个数据结构。
HP STL 其他版本的C++ STL,一般是以HP STL为蓝本实现出来的,HP STL是C++ STL的第一个实现版本,而且开放源代码。
P.J.Plauger STL 由P.J.Plauger参照HP STL实现出来的,被Visual C++编译器所采用,不是开源的。
SGI STL 由Silicon Graphics Computer Systems公司参照HP STL实现,被Linux的C++编译器GCC所采用,SGI STL是开源软件,源码可读性甚高。
栈和队列也是SGI STL里面的数据结构
stack
push(): 在栈顶添加一个元素。
pop(): 移除栈顶元素。
top(): 返回栈顶元素的引用,但不移除它。
empty():检查栈是否为空。
size(): 返回栈中元素的数量。
queue
empty(): 检查队列是否为空。
size(): 返回队列中的元素数量。
front(): 返回队首元素的引用。
back(): 返回队尾元素的引用。
push(): 在队尾添加一个元素。
...
代码随想录day9 || 字符串2
151.翻转字符串里的单词题目链接状态:一遍过思路:使用栈,先进后出,除去空格
12345678910111213141516171819202122232425class Solution {public: string reverseWords(string s) { stack<string> stack; int n=s.size(); for(int i=0;i<n;i++){ string tmp; while(i<n&&s[i]!=' '){ tmp+=s[i++]; } if(tmp!=""){ stack.push(tmp); } } string ans = stac ...
代码随想录day8 || 字符串1
344.反转字符串题目链接状态: 一遍过思路: 基础题
1234567891011class Solution {public: void reverseString(vector<char>& s) { int n=s.size(); for(int i=0;i<n/2;i++){ char tmp=s[i]; s[i]=s[n-i-1]; s[n-i-1]=tmp; } }};
简洁版本
12345678class Solution {public: void reverseString(vector<char>& s) { for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) { swap(s[i],s[j]); ...
代码随想录day7 || 哈希表2
454.四数相加II题目链接状态:一次过但耗时长思路:和两数加和思路一样
12345678910111213141516class Solution {public: int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) { unordered_map<int, int> mp; int res = 0; for (int i : nums1) for (int j : nums2) mp[-(i + j)]++; for (int i : nums3) for (int j : nums4) res += mp[i + j];// 如果 m ...
代码随想录day6 || 哈希表1
哈希表理论基础目的:快速判断一个元素是否出现集合里常见的三种哈希结构数组、set (集合)、map(映射)(偷懒直接截图了)
242.有效的字母异位词题目链接状态:两遍过错误原因:为考虑两字符串长度不同可直接返回false思路:之前在《904. 水果成篮》中学到的unordered_map可直接用
12345678910111213class Solution {public: bool isAnagram(string s, string t) { int m = s.size(), n = t.size(); if (m != n) return false;//第一次未考虑到 unordered_map<char, int> ans; for (int i = 0; i < m; i++) ans[s[i]]++; for (int j = 0; j < n; j++) if (--ans[t[j]] < 0) ...
代码随想录day4 || 链表2
24. 两两交换链表中的节点题目链接状态: 一遍过思路: 使用虚拟节点放在开头,注意盯住三个节点的变化即可
原始代码
1234567891011121314151617181920212223class Solution {public: ListNode* swapPairs(ListNode* head) { if (head == nullptr || head->next == nullptr) return head; ListNode* dummynode = new ListNode(0); dummynode->next = head; ListNode *cur = head->next, *pre = head, *h = dummynode; while (cur != nullptr) { pre->next = cur->next; cur->next = ...
代码随想录day3 || 链表
链表一、定义与方法使用结构体
123456// 单链表struct ListNode { int val; // 节点上存储的元素 ListNode *next; // 指向下一个节点的指针 ListNode(int x): val(x), next(NULL) {} // 节点的构造函数};
使用类
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778class LNode {public: int val; LNode *next; LNode(int x) : val(x), next(nullptr) {}};class LinkedList {private: LNode *head;public: ...
代码随想录day2 || 数组2
27. 移除元素题目链接状态:一遍过思路:直接遍历一遍,若不等则改变
12345678910class Solution {public: int removeElement(vector<int>& nums, int val) { int k = 0, n = nums.size(); for (int i = 0; i < n; i++) if (nums[i] != val) nums[k++] = nums[i]; return k; }};
小结:此方法为双指针法或快慢指针法
26. 删除有序数组中的重复项题目链接状态:有思路但错了很多次错误原因:下标范围错误,因为要考虑第一个元素的问题,判断错误
1234567891011121314151617class Solution {public: int removeDuplicates(vector<int>& nums ...
