matlab的開方演算法 常見演算法的MATLAB實現

2021-10-12 13:33:28 字數 1917 閱讀 9309

順序刪去圖中的邊,若不形成迴路則將此邊加入最小生成樹。

function find(v:integer):integer;

var i:integer;

begin

i:=1;

while (i< =n) and (not v in vset) do inc(i);

if i< =n then find:=i

else find:=0;

end;

procedure kruskal;

vartot,i,j:integer;

begin

for i:=1 to n do vset:=;

p:=n-1; q:=1; tot:=0;

sort;

while p >0 do

begin

i:=find(e[q].v1);j:=find(e[q].v2);

if i< >j then

begin

inc(tot,e[q].len);

vset:=vset+vset[j];vset[j]:=;

dec(p);

end;

inc(q);

end;

writeln(tot);

end;

5.最短路徑

a.標號法求解單源點最短路徑:

vara:array[1..maxn,1..maxn] of integer;

b:array[1..maxn] of integer;

mark:array[1..maxn] of boolean;

procedure bhf;

varbest,best_j:integer;

begin

fillchar(mark,sizeof(mark),false);

mark[1]:=true; b[1]:=0;

repeat

best:=0;

for i:=1 to n do

if mark then

for j:=1 to n do

if (not mark[j]) and (a[i,j] >0) then

if (best=0) or (b+a[i,j]< best) then

begin

best:=b+a[i,j]; best_j:=j;

end;

if best >0 then

begin

b[best_j]:=best;mark[best_j]:=true;

end;

until best=0;

end;

b.floyed演算法求解所有頂點對之間的最短路徑:

procedure floyed;

begin

for i:=1 to n do

for j:=1 to n do

if a[i,j] >0 then p[i,j]:=i else p[i,j]:=0;

for k:=1 to n do

for i:=1 to n do

for j:=1 to n do

if a[i,k]+a[j,k]< a[i,j] then

begin

a[i,j]:=a[i,k]+a[k,j];

p[i,j]:=p[k,j];

end;

end;

c. dijkstra 演算法:

類似標號法,本質為貪心演算法。

vara:array[1..maxn,1..maxn] of integer;

b,pre:array[1..maxn] of integer;

mark:array[1..maxn] of boolean;

procedure dijkstra(v0:integer);

begin

fillch

關於開方的迭代演算法

去年某司有一道面試題是不用 開根號計算開方,當時第一反應就是迭代逼近,但是對方還要求能不能把速度加快,先稍作總結。迭代逼近意思就是 我先隨便取乙個數,如果平方大於給定 n,那麼就取乙個小一點的 如果小了,那就取個大一點,最後達到精度要求即可。實現 class solution else x x 快速...

MATLAB中負實數開方的問題

在matlab中,對於乙個負實數開方,比如 8 1 3 有的matlab版本返回 2,而有的matlab版本返回三個值,包括兩個複數。這是因為matlab會在複數域求所有的解。如果只想獲得實數根,那麼可以使用 x nthroot 8,3 或者sign 8 abs 8.1 3 如果想一次性得到所有複數...

陌陌面試 演算法(估算開方)

二分法 import math from math import sqrt def sqrt binary num x sqrt num y num 2.0 min 0.0 max num 1.0 count 1 while abs y x 0.00000001 print count,y coun...