数据结构--图 Graph

文章目录

    • 1. 概念
    • 2. 存储方法
      • 2.1 邻接矩阵 Adjacency Matrix
      • 2.2 邻接表 Adjacency List
    • 3. 图的遍历
      • 3.1 广度优先搜索BFS(Breadth First Search)
      • 3.2 BFS代码(基于邻接表)
      • 3.3 深度优先搜索DFS(Depth First Search)
      • 3.4 DFS代码(基于邻接表)
      • 3.5 BFS代码(基于邻接矩阵)
      • 3.6 DFS代码(基于邻接矩阵)

1. 概念

在这里插入图片描述
在这里插入图片描述
顶点的入度,表示有多少条边指向这个顶点;
顶点的出度,表示有多少条边是以这个顶点为起点指向其他顶点。
在这里插入图片描述

2. 存储方法

2.1 邻接矩阵 Adjacency Matrix

在这里插入图片描述
存储比较浪费,有的顶点很多,但是边很少(微信用户很多,每个用户的好友只百个),用邻接矩阵存储,其中大部分都是0,浪费。

邻接矩阵优点。

  • 首先,邻接矩阵的存储方式简单、直接,因为基于数组,所以在获取两个顶点的关系时,就非常高效。
  • 其次,用邻接矩阵存储图的另外一个好处是方便计算(矩阵运算)。

2.2 邻接表 Adjacency List

在这里插入图片描述
邻接表节省内存,但是查找起来需要遍历链表,可以将链表改造成红黑树、跳表、散列表、有序动态数组(二分查找)等。
在这里插入图片描述
在这里插入图片描述

3. 图的遍历

3.1 广度优先搜索BFS(Breadth First Search)

在这里插入图片描述

3.2 BFS代码(基于邻接表)

  • 广度优先搜索找到的是最短路径
/*** @description: BFS* @author: michael ming* @date: 2019/6/4 23:05* @modified by: */
#include <list>
#include <queue>
#include <iostream>
#include <memory.h>
using namespace std;
class graph
{int v;//顶点个数list<int> *adj;//邻接表
public:graph(int numofvertex){v = numofvertex;adj = new list<int> [v];}~graph(){delete [] adj;}void insertEdge(int s, int t)   //无向图,一次存两边{s--;t--;adj[s].push_back(t);adj[t].push_back(s);}void print(){for(int i = 0; i < v; ++i){cout << "邻接表,节点 " << i << " is \n";for(auto it = adj[i].begin(); it != adj[i].end();++it){cout << *it << " ";}cout << endl;}}void bfs(int s)//从s开始遍历全部{bool *visited = new bool [v];memset(visited,false, sizeof(bool)*(v));visited[s] = true;//visited存储已经访问的节点,避免重复访问list<int> q;//q.push_back(s);list<int>::iterator it;cout << "从" << s << "开始广度搜索的结果是:" << endl;while(!q.empty()){int w = q.front();cout << w << " ";q.pop_front();for(it = adj[w].begin(); it != adj[w].end();++it){if(visited[*it]==false){visited[*it] = true;q.push_back(*it);}}}delete [] visited;}void bfs(int s, int t)//从s开始,搜索t{if(s == t)return;bool *visited = new bool [v];memset(visited,false, sizeof(bool)*(v));visited[s] = true;//visited存储已经访问的节点,避免重复访问list<int> q;q.push_back(s);int *prev = new int [v];//记录搜索的路径for(int i = 0; i < v; ++i)prev[i] = -1;list<int>::iterator it;cout << "从" << s << "开始搜索" << t << "的结果是:" << endl;while(!q.empty()){int w = q.front();q.pop_front();for(it = adj[w].begin(); it != adj[w].end();++it){if(visited[*it]==false){prev[*it] = w;//从w找到了it位置,记录下来if(*it == t){printPath(prev, s, t);//递归打印路径delete [] visited;delete [] prev;return;}visited[*it] = true;q.push_back(*it);}}}delete [] visited;delete [] prev;}void printPath(int *prev, int s, int t){if(prev[t] != -1 && t != s){printPath(prev, s, prev[t]);//递归打印路径}cout << t << " ";}
};int main()
{graph gp(8);gp.insertEdge(1,2);gp.insertEdge(2,3);gp.insertEdge(1,4);gp.insertEdge(2,5);gp.insertEdge(3,6);gp.insertEdge(4,5);gp.insertEdge(5,6);gp.insertEdge(5,7);gp.insertEdge(6,8);gp.insertEdge(7,8);gp.print();gp.bfs(7);cout << endl;gp.bfs(7,1);return 0;
}

在这里插入图片描述
最坏情况,起终点很远,所有点都要进出队列,每个边也被访问一次,时间复杂度O(V+E),对于所有顶点都是联通的,E边大于等于V-1,可简写O(E);
空间复杂度O(V),存储的空间不会超过顶点个数

3.3 深度优先搜索DFS(Depth First Search)

一条路走到底,发现都访问过了,还没找到,返回到上一个岔路口,继续查找。

3.4 DFS代码(基于邻接表)

void dfs_r(int s)//从s开始递归法深度搜索遍历
{cout << "从" << s << "开始深度搜索的结果是(递归):" << endl;bool *visited = new bool [v];memset(visited,false, sizeof(bool)*(v));dfs_recu(visited, s);delete [] visited;
}
void dfs_recu(bool *visited, int s)
{list<int>::iterator it;visited[s] = true;cout << s << " ";for(it = adj[s].begin(); it != adj[s].end();++it){if(!visited[*it])dfs_recu(visited, *it);}
}
void dfs_r(int s, int t)//从s开始递归法深度遍历搜索t
{bool found = false;cout << "从" << s << "开始深度搜索" << t << "的结果是(递归):" << endl;bool *visited = new bool [v];memset(visited,false, sizeof(bool)*(v));int *prev = new int [v];//记录搜索的路径for(int i = 0; i < v; ++i)prev[i] = -1;dfs_recu(visited, prev, found, s, t);printPath(prev, s, t);delete [] visited;delete [] prev;
}
void dfs_recu(bool *visited, int *prev, bool &found, int s, int t)
{if(found == true)//如果已经找到了,for循环剩余的不执行(优化)return;visited[s] = true;if(s == t){found = true;return;}for(auto it = adj[s].begin(); it != adj[s].end();++it){if(!visited[*it]){prev[*it] = s;dfs_recu(visited, prev, found, *it, t);}}
}
void dfs(int s)//从s开始,非递归深度遍历
{bool *visited = new bool [v];memset(visited,false, sizeof(bool)*(v));visited[s] = true;//visited存储已经访问的节点,避免重复访问stack<int> q;q.push(s);list<int>::iterator it;cout << "从" << s << "开始深度搜索的结果是(非递归):" << endl;while(!q.empty()){int w = q.top();q.pop();if(visited[w] == true){cout << w << " ";for(it = adj[w].begin(); it != adj[w].end();++it){if(visited[*it]==false){visited[*it] = true;q.push(*it);}}}}delete [] visited;
}
void dfs(int s, int t)//从s开始,非递归深度遍历搜索t
{if(s == t)return;bool *visited = new bool [v];memset(visited,false, sizeof(bool)*(v));visited[s] = true;//visited存储已经访问的节点,避免重复访问stack<int> q;q.push(s);int *prev = new int [v];//记录搜索的路径for(int i = 0; i < v; ++i)prev[i] = -1;list<int>::iterator it;cout << "从" << s << "开始深度搜索" << t << "的结果是(非递归):" << endl;while(!q.empty()){int w = q.top();q.pop();if(visited[w] == true){for(it = adj[w].begin(); it != adj[w].end();++it){if(visited[*it]==false){prev[*it] = w;if(*it == t){printPath(prev, s, t);//递归打印路径delete [] visited;delete [] prev;return;}visited[*it] = true;q.push(*it);}}}}delete [] visited;delete [] prev;
}
gp.dfs_r(6);    cout << endl;
gp.dfs(6);      cout << endl;
gp.dfs_r(5,3);  cout << endl;
gp.dfs(5,3);

在这里插入图片描述
深度优先和广度优先搜索的时间复杂度都是O(E),空间复杂度是 O(V)。
基于邻接表的 BFS&DFS 完整代码:https://github.com/hitskyer/course/blob/master/dataAlgorithm/chenmingming/graph/BFS_DFS.cpp

3.5 BFS代码(基于邻接矩阵)

/*** @description: 基于邻接矩阵的无向图* @author: michael ming* @date: 2019/6/11 21:50* @modified by: */
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
#define MaxNum 20   //最大顶点数
#define MaxValue 65535  //最大值(标记矩阵空位)
class arrGraph  //邻接矩阵图
{
public:char vertex[MaxNum];    //顶点信息int GType;              //图的类型(0无向图,1有向图)int v;                  //顶点个数int e;                  //边数量int ew[MaxNum][MaxNum]; //边的权重int visited[MaxNum];    //访问标志arrGraph(int vertexNum, int edgeNum, int gt = 0){v = vertexNum;e = edgeNum;GType = gt;clearGraph();}void creatGraph(){int i, j, k;//循环用计数器int weight;//权重char startV, endV;//边的起始终止点cout << "输入图中各顶点的信息:" << endl;for(i = 0; i < v; ++i){cout << "第" << i+1 << "个顶点:";cin >> vertex[i];}cout << "输入各边的起点,终点,权值:" << endl;for(k = 0; k < e; ++k){cout << "第" << k+1 << "条边:";cin >> startV >> endV >> weight;for(i = 0; startV != vertex[i]; ++i);   //查找起点for(j = 0; endV != vertex[j]; ++j);     //终点ew[i][j] = weight;                      //权值,一条边 i->jif(GType == 0)ew[j][i] = weight;  //无向图,对称位置一样的权}}void clearGraph(){int i, j;for(i = 0; i < v; ++i)for(j = 0; j < v; ++j)ew[i][j] = MaxValue;    //清空矩阵(每个值置为MaxValue)}void printArrOfGraph(){int i, j;for(j = 0; j < v; ++j)cout << "\t" << vertex[j];//第1行顶点信息cout << endl;for(i = 0; i < v; ++i){cout << vertex[i];for(j = 0; j < v; ++j){if(ew[i][j] == MaxValue)cout << "\t∞";elsecout << "\t" << ew[i][j];}cout << endl;}}int findPos(char ch){int i;for(i = 0; i < v && ch != vertex[i]; ++i);//找到ch的位置ireturn i;}void bfs(char s)//从字符s开始广度遍历{int i, k;for(i = 0; i < v; ++i)visited[i] = 0;//访问标志置0i = findPos(s);if(i >= v)return;visited[i] = 1;queue<char> q;q.push(s);cout << "从 " << s << " 开始广度优先遍历结果:" << endl;while(!q.empty()){char w = q.front();cout << w << " ";q.pop();k = findPos(w);for(i = 0; i < v; ++i){if(ew[k][i] != MaxValue && !visited[i]){visited[i] = 1;q.push(vertex[i]);}}}cout << endl;}void bfs(char s, char t)//从字符s开始广度优先搜索t{if(s == t)return;int i, k;k = findPos(s);if(k >= v)return;//s不存在for(i = 0; i < v; ++i)visited[i] = 0;//访问标志置0visited[k] = 1;//访问s,存入队列queue<char> q;q.push(s);char *prev = new char [v];//记录搜索的路径for(i = 0; i < v; ++i)prev[i] = '*';cout << "从 " << s << " 开始广度优先搜索 " << t << " 路径:" << endl;while(!q.empty()){char w = q.front();q.pop();k = findPos(w);for(i = 0; i < v; ++i){if(ew[k][i] != MaxValue && !visited[i]){prev[i] = vertex[k];    //从k处找到了i位置,记录下来if(vertex[i] == t){printPath(prev, s, t, i);//递归打印路径cout << t << endl;delete [] prev;return;}visited[i] = 1;q.push(vertex[i]);}}}delete [] prev;cout << endl;}void printPath(char *prev, char s, char t, int i){int k = findPos(prev[i]);if(prev[k] != '*' && t != s){printPath(prev, s, prev[k], k);//递归打印路径}cout << prev[i] << " ";}
};int main()
{arrGraph ag(8,10);    //8个顶点,10条边,默认生成无向图ag.creatGraph();
//    A — B — C
//    |   |   |
//    D — E — F
//        |   |
//        G — H
//请输入A B C D E F G H  A B 1 B C 1 A D 1 B E 1 C F 1 D E 1 E F 1 E G 1 F H 1 G H 1cout << "打印图的邻接矩阵:" << endl;ag.printArrOfGraph();ag.bfs('B');ag.bfs('A','G');
}

在这里插入图片描述

3.6 DFS代码(基于邻接矩阵)

void dfs_r(char s)//从字符s开始递归深度优先遍历
{int i, j;i = findPos(s);if(i >= v)return;j = i;//j存储了开始字符s的位置for(i = 0; i < v; ++i)visited[i] = 0;//访问标志置0cout << "从 " << s << " 开始深度优先遍历结果(递归):" << endl;for(i = 0; i < v; ++i,++j){if(j == v)j = 0;if(!visited[j])//没有访问dfs_recu(j);}cout << endl;
}
void dfs_recu(int k)
{visited[k] = 1;cout << vertex[k] << " ";for(int i = 0; i < v; ++i){if(ew[k][i] != MaxValue && !visited[i])dfs_recu(i);}
}void dfs_r(char s, char t)//从字符 s 开始递归深度优先搜索 t
{cout << "从 " << s << " 开始深度优先搜索 " << t << " 路径(递归):" << endl;bool found = false;int i, j;char *prev = new char [v];//记录搜索的路径for(i = 0; i < v; ++i)prev[i] = '*';i = findPos(s);j = i;//j存储了开始字符s的位置if(i >= v)return;if(s == t)return;for(i = 0; i < v; ++i)visited[i] = 0;//访问标志置0for(i = 0; i < v; ++i,++j){if(j == v)j = 0;if(!visited[j])//没有访问dfs_recu(j, prev, found, s, t);}i = findPos(t);printPath(prev, s, t, i);//递归打印路径cout << t << endl;delete [] prev;
}
void dfs_recu(int k, char *prev, bool &found, char s, char t)
{if(found == true)//如果已经找到了,for循环剩余的不执行(优化)return;visited[k] = 1;if(s == t){found = true;return;}for(int i = 0; i < v; ++i){if(ew[k][i] != MaxValue && !visited[i]){prev[i] = vertex[k];    //从k处找到了i位置,记录下来dfs_recu(i, prev, found, vertex[k], t);}}
}void dfs(char s)//从字符s开始深度优先遍历(非递归)
{int i, k;i = findPos(s);if(i >= v)return;k = i;//k存储了开始字符s的位置for(i = 0; i < v; ++i)visited[i] = 0;//访问标志置0cout << "从 " << s << " 开始深度优先遍历结果(非递归):" << endl;stack<char> q;q.push(s);visited[k] = 1;while(!q.empty()){char w = q.top();q.pop();k = findPos(w);if(visited[k])//访问过了{cout << w << " ";for(i = 0; i < v; ++i){if(ew[k][i] != MaxValue && !visited[i]){visited[i] = 1;q.push(vertex[i]);}}}}cout << endl;
}void dfs(char s, char t)//从字符s开始深度优先搜索t(非递归)
{cout << "从 " << s << " 开始深度优先搜索 " << t << " 路径(非递归):" << endl;if(s == t)return;int i, k;i = findPos(s);k = i;//k存储了开始字符s的位置if(i >= v)return;for(i = 0; i < v; ++i)visited[i] = 0;//访问标志置0char *prev = new char [v];//记录搜索的路径for(i = 0; i < v; ++i)prev[i] = '*';stack<char> q;q.push(s);visited[k] = 1;while(!q.empty()){char w = q.top();q.pop();k = findPos(w);if(visited[k])//访问过了{for(i = 0; i < v; ++i){if(ew[k][i] != MaxValue && !visited[i]){prev[i] = vertex[k];    //从k处找到了i位置,记录下来if(vertex[i] == t){printPath(prev, s, t, i);//递归打印路径cout << t << endl;delete [] prev;return;}visited[i] = 1;q.push(vertex[i]);}}}}delete [] prev;cout << endl;
}

测试

	ag.dfs_r('E');ag.dfs_r('A','H');ag.dfs('E');//非递归版本dfs貌似路径不太合理,// 如 B E G H F D C A && E G H F C D A B//可能非递归版的dfs就不叫dfs了,我瞎说的ag.dfs('A','H');

在这里插入图片描述

基于邻接矩阵的 BFS&DFS 完整代码:https://github.com/hitskyer/course/blob/master/dataAlgorithm/chenmingming/graph/arrayGraph.cpp

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019最新拼多多Java面试题:幻影读+分段锁+死锁+Spring Cloud+秒杀

拼多多Java一面 简短自我介绍 事务的ACID&#xff0c;其中把事务的隔离性详细解释一遍 脏读、幻影读、不可重复读 红黑树、二叉树的算法 平常用到哪些集合类&#xff1f;ArrayList和LinkedList区别&#xff1f;HashMap内部数据结构&#xff1f;ConcurrentHashMap分段锁&…

视频问答兴起,多跳问答热度衰退,92篇论文看智能问答的发展趋势

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 舒意恒&#xff08;南京大学硕士生&#xff0c;知识图谱方向&#xff09;编 | 北大小才女小轶2019年的时候&#xff0c;舒意恒Y.Shu整理了一份《2019年&#xff0c;智能问答有哪些研究方向&#xff1f;…

论文浅尝 | 知识图谱相关实体搜索

本文转载自公众号&#xff1a;南大Websoft。相关搜索&#xff08;Relevance Search&#xff09;是信息检索中的一个经典问题&#xff0c;相关搜索是指给定一个查询实体&#xff0c;返回与其相关度最高的实体&#xff08;一个类似的问题Similarity Search&#xff0c;一般来说指…

最新美团Java面试题目(共3面)

一面 线程池用过哪些&#xff0c;线程池有哪些参数&#xff0c;然后问我几个常用线程池的用法和实际场景问题。 集合框架的知识&#xff0c;hashmap&#xff0c;ArrayList&#xff0c;LinkedList源码相关知识&#xff0c;基本整个介绍了一遍&#xff0c;与hastable&#xff0c…

PersonGraphDataSet近十万的开放人物关系图谱项目

PersonGraphDataSet PersonGraphDataSet, nearly 10 thousand person2person relationship facts that build from extraction method, which can be applied to person kg search and inference applications。 人物图谱数据集&#xff0c;近十万的人物关系图谱事实数据库&am…

图Graph--寻找二度好友(BFS应用)

社交网络可以用图来表示&#xff08;查阅图的概念&#xff09;。 寻找二度好友&#xff0c;这个问题就非常适合用图的广度优先搜索BFS算法来解决&#xff0c;因为广度优先搜索是层层往外推进的。 首先&#xff0c;遍历与起始顶点最近的一层顶点&#xff0c;也就是用户的一度好…

技术动态 | TechKG:一个面向中文学术领域的大型知识图谱

作者&#xff1a;东北大学-知识图谱研究组 任飞亮TechKG 是一个面向中文、面向学术、多领域的大型知识图谱知识库&#xff0c;知识库由“东北大学-知识图谱研究组”开发完成。和已有知识图谱如 Freebase 或 YAGO 相比&#xff0c;TechKG 具有如下主要特点&#xff1a;1、是一个…

技术总结:图算法、开源工具及其在工业界的应用场景概述

知识图谱本质上是一种图结构&#xff0c;在图内部数据规模大且质量高、外部算力足够的情况下&#xff0c;充分利用好图算法&#xff0c;能够最大程度地发挥出其数据价值。实际上&#xff0c;图&#xff08;Graph&#xff09;是一个常见的数据结构&#xff0c;现实世界中有很多很…

SIGIR2020 | 淘宝提出结合知识图谱与大规模推荐的新框架ATBRG

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 江城编 | 夕小瑶今天分享一篇淘宝发表在 SIGIR2020 上的关于知识图谱应用于大规模推荐的论文《ATBRG: Adaptive Target-Behavior Relational Graph Network for Effective Recommendation》&#xff0c…

图Graph--农夫过河问题(BFS/DFS应用)

农夫过河问题&#xff1a; /*** description: 农夫过河问题&#xff08;羊&#xff0c;白菜&#xff0c;狼&#xff09;&#xff0c;一次最多带一个东西过河&#xff0c;* 农夫不在的情况下羊会吃白菜&#xff0c;狼会吃羊&#xff0c;如何平安过河* author…

机器学习之「二分类算法」-----银行营销案例分析

原文地址&#xff1a; <di&#xff1a;https://blog.csdn.net/weixin_44696674/article/details/88231922iv id“article_content” class“article_content clearfix” data-track-view"{“mod”:“popu_307”,“con”:",https://blog.csdn.net/weixin_44696674/…

论文浅尝 | 直译优于翻译?混合语言的知识库问答方法研究

动机作者思考&#xff0c;如果一个人懂多个语言&#xff0c;那么只要他知道某一语言的某个事实&#xff0c;就能以它作为另一语言问题的答案&#xff0c;同时希望证明计算机是否也能做到这一点&#xff0c;并完成混合语言的简单问题知识问答任务&#xff08;Code-Mix Simple Qu…

2018最新Java面试78题:数据结构+网络+NoSQL+分布式架构

算法和数据结构 数组、链表、二叉树、队列、栈的各种操作&#xff08;性能&#xff0c;场景&#xff09; 二分查找和各种变种的二分查找 各类排序算法以及复杂度分析&#xff08;快排、归并、堆&#xff09; 各类算法题&#xff08;手写&#xff09; 理解并可以分析时间和空…

工程实践:基于规则模式的军事和医药领域知识图谱问答快速实现

知识结构化问答是知识图谱的一个重要的应用方向&#xff0c;虽然现在许多真实的使用体验上&#xff0c;会被评价为“鸡肋且智障”&#xff0c;并且在落地上还没有太多的付费场景&#xff0c;但也不乏有不少学生、公司、机构在尝试花时间去做这个事情。当前&#xff0c;医疗知识…

图Graph--最小生成树

文章目录1.概念2.构造最小生成树Prim算法3.构造最小生成树Kruskal算法1.概念 对图运用不同的遍历方法就可能得到图的不同遍历顺序&#xff0c;每一种遍历顺序对应于一棵生成树对于无向连通图&#xff0c;所有的生成树中必有一棵树的所有边的权的总和最小的&#xff0c;称之为最…

Longformer:超越RoBERTa,为长文档而生的预训练模型

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | ChrisCao, 小轶前言今天要与大家分享的是AllenAI今年发表的最新工作&#xff0c;Longformer——一种可高效处理长文本的升级版Transformer。作者团队提供了开源代码&#xff0c;大家可快速复现&#xff…

工程实践:基于规则句法的事件关系与主谓宾三元组抽取项目实现

目前&#xff0c;知识图谱在学术界如火如荼地进行&#xff0c;但受限于知识图谱各个环节中的性能问题&#xff0c;还尚未能够在工业界大规模运用。而与知识图谱中以实体为知识节点&#xff0c;实体关系为实体关系边对知识进行组织不同&#xff0c;以事件作为节点&#xff0c;事…

论文浅尝 | LightRNN:存储和计算高效的 RNN

链接&#xff1a;https://arxiv.org/pdf/1610.09893.pdf动机在NLP任务中使用RNN已经被证明是很有用的模型方法。但是传统的RNN在NLP中的应用有一个很大的限制&#xff1a;RNN的输出输入Embedding占用的空间太大&#xff0c;比如1024维10M词表大小的Embedding矩阵就要占掉40GB&a…

阿里最全Java面试100题汇总:涵盖天猫、蚂蚁金服等面试题!含答案~

【阿里天猫、蚂蚁、钉钉面试题目】 1、微信红包怎么实现。 2、海量数据分析。 3、测试职位问的线程安全和非线程安全。 4、HTTP2.0、thrift。 5、面试电话沟通可能先让自我介绍。 6、分布式事务一致性。 7、nio的底层实现。 8、jvm基础是必问的&#xff0c;jvm GC原理&a…

ACL2020 奇葩论文标题大赏

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 灵魂写手rumor酱编 | 不拖更的夕小瑶又是一年一度的ACL&#xff0c;之前通过卖萌屋Arxiv服务已经零零碎碎看了一些&#xff0c;还是准备刷一下论文list&#xff0c;看看哪篇能让我的模型效果一飞冲天。…