先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Python全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注Python)
正文
从问题的某一初始解出发;
while 能朝给定总目标前进一步 do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解;
1.2 图论及求解最短距离
1.2.1 方法选择:
(1)需要求解任意两个节点之间的最短距离,使用 Floyd 算法;
(2)只要求解单源最短路径问题,有负权边时使用 Bellman-Ford 算法,没有负权边时使用 Dijkstra 算法;
(3)A*算法找到的是相对最优路径,适合大规模、实时性高的问题。
本节我们只讨论Dijkstra 算法。
1.2.2 狄克斯屈拉(Dijkstra)算法
适用于wij≥0,给出了从vs到任意一个点vj的最短路。
Dijkstra算法是在1959年提出来的。目前公认,在所有的权wij ≥0时,这个算法是寻求最短路问题最好的算法。并且,这个算法实际上也给出了寻求从一个始定点vs到任意一个点vj的最短路。
2 案例1——贪心算法实现
==============
2.1 旅行商问题(TSP)
**旅行商问题(TravelingSalesmanProblem,TSP)**一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要遍历所有城市一次且只能一次,回到出发地。应如何选择行进路线,以使总的行程最短。
旅行商问题(TSP)即给定一组城市以及每对城市之间的距离,需要找到一条最短的路线,该路线只对每个城市进行一次访问并返回起点。
这里注意汉密尔顿活路(Hamiltonian Cycle)和TSP之间的区别。汉密尔顿回路问题是要找出是否存在一次游览每个城市一次的路线。在TSP问题中,我们是已知存在汉密尔顿回路(因为该图是完整的),并且实际上,存在许多此类回路,TSP问题在于找到最小权重的汉密尔顿回路。
目前解决TSP问题的方法有许多种,比如:贪心算法、动态规划算法、分支限界法;也有智能算法。本文先介绍贪心算法:
2.2 案例
数据 如下图,第一列城市名。第二列坐标x,第三列坐标y:
贪心算法思路:随便选择出发城市,然后每次选择要去的下一个城市时,都选择还没去的最近的城市。
2.3 Python实现
#第一步:导入相关库==========
import pandas as pd
import numpy as np
import math
import time
#第二步:读取数据===========
dataframe = pd.read_csv(“旅行商问题.csv”, sep=“,”, header=None)
v = dataframe.iloc[:, 1:3] #去除第一列12345678910,只保留x,y
print(‘读取数据:----------------------------’)
print(v)
#=第三步:计算城市之间的距离==
train_v= np.array(v)
train_d=train_v
dist = np.zeros((train_v.shape[0],train_d.shape[0])) #初始化距离 为10*10的全0矩阵
print(dist.shape) #(10,10)
#计算距离矩阵=
for i in range(train_v.shape[0]):
for j in range(train_d.shape[0]):
dist[i,j] = math.sqrt(np.sum((train_v[i,:]-train_d[j,:])**2))
print(‘距离矩阵:----------------------------------’)
print(dist)
#第四步:计算距离和路径====
“”"
s:已经遍历过的城市
dist:城市间距离矩阵
sumpath:目前的最小路径总长度
Dtemp:当前最小距离
flag:访问标记
“”"
i=1
n=train_v.shape[0]#城市个数
j=0
sumpath=0#目前的最小路径总长度
s=[]#已经遍历过的城市
s.append(0)#从城市0开始
start = time.perf_counter() #time.clock()
while True:
k=1#从1开始,因为人在城市0,所以我们设定先从城市1开始选择
Detemp=float(‘inf’)#当前最小距离
while True:
flag=0#访问标记,否0
if k in s:#是否访问,如果访问过,flag设为1
flag = 1
if (flag==0) and (dist[k][s[i-1]] < Detemp):#如果未访问过,并且距离小于最小距离
j = k;
Detemp=dist[k][s[i - 1]]; #当前两座城市相邻距离
k+=1#遍历下一城市
if k>=n:
break;
s.append(j)
i+=1;
sumpath+=Detemp
if i>=n:
break;
sumpath+=dist[0][j]#加上dist[0][j] 表示最后又回到起点
end = time.perf_counter() #time.clock()
print(“距离:”)
print(sumpath)
print(‘--------------’)
print(‘路径:’)
for m in range(n):
print("%s-> "%(s[m]),end=‘’)
print()
print(“程序的运行时间是:%s”%(end-start))
代码解析:数字k表示当前我们选择前往下一个城市时,我们需要计算所有未访问过的城市和当前城市距离。
数字i 用于控制访问过的城市,我们需要到达每一个城市。
代码中有两个while
里面那个while表示选择下一城市时,需要遍历所有未访问过的城市,然后选择距离当前城市最近的城市,赋值给j
外面while,表示我们的每一步,我们需要去每个城市。
2.4 结果
读取数据:----------------------------
1 2
0 2066 2333
1 935 1304
2 1270 200
3 1389 700
4 984 2810
5 2253 478
6 949 3025
7 87 2483
8 3094 1883
9 2706 3130
(10, 10)
距离矩阵:----------------------------------
[[ 0. 1529.05264788 2276.68728639 1767.77204413 1182.47748393
1864.40178073 1313.98363765 1984.67654795 1122.17823896 1022.15898959]
[1529.05264788 0. 1153.70750193 755.6004235 1506.7969339
1555.44205935 1721.0569427 1452.28957168 2235.29013777 2543.76040538]
[2276.68728639 1153.70750193 0. 513.96595218 2625.6229737
1021.55420806 2843.17885473 2571.29889356 2481.82694804 3262.97349055]
[1767.77204413 755.6004235 513.96595218 0. 2148.51693035
892.06502005 2366.26815894 2207.7801068 2075.21420581 2763.94446399]
[1182.47748393 1506.7969339 2625.6229737 2148.51693035 0.
2654.91713618 217.83020911 954.74499213 2304.65377009 1751.48051659]
[1864.40178073 1555.44205935 1021.55420806 892.06502005 2654.91713618
-
2861.40262808 2951.53875123 1637.46938903 2690.41130685]
[1313.98363765 1721.0569427 2843.17885473 2366.26815894 217.83020911
2861.40262808 0. 1018.23769327 2430.05946429 1760.13465394]
[1984.67654795 1452.28957168 2571.29889356 2207.7801068 954.74499213
2951.53875123 1018.23769327 0. 3066.2760802 2697.7342345 ]
[1122.17823896 2235.29013777 2481.82694804 2075.21420581 2304.65377009
1637.46938903 2430.05946429 3066.2760802 0. 1305.9682232 ]
[1022.15898959 2543.76040538 3262.97349055 2763.94446399 1751.48051659
2690.41130685 1760.13465394 2697.7342345 1305.9682232 0. ]]
距离:
10464.183486532447
--------------
路径:
0-> 9-> 8-> 5-> 3-> 2-> 1-> 7-> 4-> 6->
程序的运行时间是:0.0002605780000024538
Process finished with exit code 0
3 案例2——图论及最短距离
===============
3.1 知识点
3.2 networkx绘图
3.2.1 创建图
networkx有四种图 Graph 、DiGraph、MultiGraph、MultiDiGraph,分别为无多重边无向图、无多重边有向图、有多重边无向图、有多重边有向图。
#创建图======
import networkx as nx # 导入 NetworkX 工具包
G1 = nx.Graph() # 创建:空的 无向图
G2 = nx.DiGraph() #创建:空的 有向图
G3 = nx.MultiGraph() #创建:空的 多图
G4 = nx.MultiDiGraph() #创建:空的 有向多图
3.2.2 定点的添加、删除和查看
#====顶点的添加、删除和查看=
#==顶点(node)的操作=
#向图中添加顶点
G1.add_node(1) # 向 G1 添加顶点 1
G1.add_node(1, name=‘n1’, weight=1.0) # 添加顶点 1,定义 name, weight 属性
G1.add_node(2, date=‘May-16’) # 添加顶点 2,定义 time 属性
G1.add_nodes_from([3, 0, 6], dist=1) # 添加多个顶点,并定义属性
G1.add_nodes_from(range(10, 15)) # 向图 G1 添加顶点 10~14
#查看顶点和顶点属性
print(G1.nodes()) # 查看顶点列表
[1, 2, 3, 0, 6, 10, 11, 12, 13, 14]
print(G1._node) # 查看顶点属性
{1: {‘name’: ‘n1’, ‘weight’: 1.0}, 2: {‘date’: ‘May-16’}, 3: {‘dist’: 1}, 0: {‘dist’: 1}, 6: {‘dist’: 1}, 10: {}, 11: {}, 12: {}, 13: {}, 14: {}}
#从图中删除顶点
G1.remove_node(1) # 删除顶点
G1.remove_nodes_from([1, 11, 13, 14]) # 通过顶点标签的 list 删除多个顶点
print(G1.nodes()) # 查看顶点
[2, 3, 0, 6, 10, 12] # 顶点列表
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
[外链图片转存中…(img-qFzRrCNb-1713098706381)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!