二分算法在 PLC 编程中的应用 (二分算法在计算机的应用)

二分算法在

简介

二分算法是一种高效的搜索算法,它通过将一个已排序数组的范围不断减半来查找目标元素。在 PLC 编程中,二分算法可以用于各种应用程序,例如查找数据表中的记录、执行二进制搜索或进行比较操作。

二分算法的原理

二分算法通过以下步骤工作:1. 将数组范围设定为 [low, high]。 2. 计算数组中点 mid = (low + high) / 2。 3. 将目标元素与 mid 处的元素比较。 4. 如果目标元素等于 mid 处的元素,则返回 mid。 5. 如果目标元素小于 mid 处的元素,则将 high 更新为 mid - 1。 6. 如果目标元素大于 mid 处的元素,则将 low 更新为 mid + 1。 7. 重复步骤 2-6,直到 low > high。 8. 如果数组中没有找到目标元素,则返回 -1。

PLC 编程中的示例

以下是在 PLC 编程中使用二分算法的示例,用于查找数据表中的记录: st // 定义数据表 DTL_MyTable STRUCTName: STRING;Value: INT; END_STRUCT; MyTable: ARRAY[0..10] OF DTL_MyTable;// 定义二分算法函数 FUNCTION BinarySearch(table: ARRAY OF DTL_MyTable; target: INT) : INTVARlow: INT := 0;high: INT := LEN(table) - 1;WHILE low <= high DOVARmid: INT := (low + high) DIV 2;IF table[mid].Value = target THENRETURN mid;ELSIF table[mid].Value < target THENlow := mid + 1;ELSEhigh := mid - 1;END_IF;END_WHILE;RETURN-1; // 目标元素未找到 END_FUNCTION;

优点和缺点

优点:高效,时间复杂度为 O(log n)。易于实现。适用于大数据集。缺点:要求数组已排序。对于小型数据集,效率可能不如线性搜索算法。

总结

二分算法是一种在 PLC 编程中广泛使用的强大工具,它可以用于快速高效地执行搜索和其他操作。通过了解算法原理和实现示例,工程师可以利用二分算法来优化其程序,提高性能和可靠性。

由于计算过程的具体运算复杂,但每一步的方式相同,所以可通过编写程序来运算。 Java语言public int binarySearch(int[]%d large quick sort take time:%d,[LEN,GetTickCount-Start]);end;Pascal,非递归快排1vars:packed array[0..100,1..7]of longint;t:boolean;i,j,k,p,l,m,n,r,x,ii,jj,o:longint;a:packed array[1..]of longint;function check:boolean;beginif i>2 then exit(false);case i of1:if (s[k,3]<s[k,2]) then exit(true);2:if s[k,1]<s[k,4] then exit(true);end;exit(false);end;procedure qs; //非递归快速排序begink:=1;t:=true;s[k,1]:=1;s[k,2]:=n;s[k,3]:=1;while k>0 dobeginr:=s[k,2];l:=s[k,1];ii:=s[k,3];jj:=s[k,4];if t thenif (r-l>30) thenbeginx:=a[(r-l+1)shr 1 +l];ii:=s[k,1];jj:=s[k,2];repeatwhile a[ii]<x do inc(ii);while a[jj]>x do dec(jj);if ii<=jj thenbeginm:=a[ii];a[ii]:=a[jj];a[jj]:=m;inc(ii);dec(jj);end;until ii>jj;s[k,3]:=ii;s[k,4]:=jj;endelse beginfor ii:=l to r dobeginm:=a[ii];jj:=ii-1;while (m<a[jj])and(jj>0) dobegina[jj+1]:=a[jj];dec(jj);end;a[jj+1]:=m;end;t:=false; dec(k);end;if t thenfor i:=1 to 3 doif check then break;if not t thenbegini:=s[k,5];repeatinc(i);until (i>2)or check;end;if i>2 then begin t:=false; dec(k);endelse t:=true;if t thenbegins[k,5]:=i;inc(k);case i of1:begin s[k,1]:=s[k-1,3];s[k,2]:=s[k-1,2];end;2:begin s[k,1]:=s[k-1,1];s[k,2]:=s[k-1,4];end;end;end;end;end;beginreadln(n);for i:=1 to n do read(a[i]);k:=1;qs;for i:=1 to n do //输出write(a[i], );writeln;end.经测试,非递归快排比递归快排快。 Pascal,非递归快排2//此段快排使用l队列储存待处理范围vara:Array[1..] of longint;l:Array[1..,1..2] of longint;n,i:longint;procedure fs;//非递归快排vars,e,k,j,ms,m:longint;begins:=1;e:=1;l[1,1]:=1;l[1,2]:=n;while s<=e dobegink:=l[s,1];j:=l[s,2];m:=random(j-k+1)+k;ms:=a[m];a[m]:=a[k];while k<j dobeginwhile (k<j)and(a[j]>ms) do dec(j);if k<j then begin a[k]:=a[j];inc(k);end;while (k<j)and(a[k]<ms) do inc(k);if k<j then begin a[j]:=a[k];dec(j);end;end;a[k]:=ms;if l[s,1]<k-1 then begin inc(e);l[e,1]:=l[s,1];l[e,2]:=k-1;end;if j+1<l[s,2] then begin inc(e);l[e,1]:=j+1;l[e,2]:=l[s,2];end;inc(s);end;end;beginrandomize;read(n);for i:=1 to n do read(a[i]);fs;for i:=1 to n do write(a[i], );end.实战Problem:大整数开方 NOIP2011普及组初赛完善程序第二题题目描述输入一个正整数n(1<n<10^100),试用二分法计算它的平方根的整数部分。 代码ConstSIZE = 200;Typehugeint = Recordlen : Integer;num : Array[] Of Integer;End; //len表示大整数的位数;num[1]表示个位、num[2]表示十位,以此类推Vars : String;i : Integer;target, left, middle, right : hugeint;Function times(a, b : hugeint) : hugeint; // 计算大整数 a 和 b 的乘积Vari, j : Integer;ans : hugeint; BeginFillChar(ans, SizeOf(ans), 0);For i := 1 To DoFor j := 1 To [i + j - 1] := [i + j - 1] + [i] * [j];For i := 1 To + [i + 1] := [i + 1] + [i] DIV 10;[i] := [i] mod 10;If [ + ] > 0Then := + := + - 1;End;times := ans; End;Function add(a, b : hugeint) : hugeint; // 计算大整数 a 和 b 的和Vari : Integer;ans : hugeint; BeginFillChar(, SizeOf(), 0);If > := := ;For i := 1 To [i] :=[i] + [i] + [i];[i + 1] := [i + 1] + [i] DIV 10;[i] := [i] MOD 10;End;If [ + 1] > 0Then Inc();add := ans;End;Function average(a, b : hugeint) : hugeint; // 计算大整数 a 和 b 的平均数的整数部分Vari : Integer;ans : hugeint; Beginans := add(a, b);For i := DownTo 2 [i - 1] := [i - 1] + ([i] mod 2) * 10;[i] := [i] DIV 2;End;[1] := [1] DIV 2;If [] = 0Then Dec();average := ans; End;Function plustwo(a : hugeint) : hugeint; // 计算大整数 a 加 2 后的结果Vari : Integer;ans : hugeint; Beginans := a;[1] := [1] + 2;i := 1;While (i <= ) AND ([i] >= 10) [i + 1] := [i + 1] + [i] DIV 10;[i] := [i] MOD 10;Inc(i);End;If [ + 1] > 0Then inc();plustwo := ans; End;Function over(a, b : hugeint) : Boolean; // 若大整数 a > b 则返回 1, 否则返回 0Vari : Integer; BeginIf (<) ThenBeginover := FALSE;Exit;End;If > ThenBeginover := TRUE;Exit;End;For i := DownTo 1 DoBeginIf [i] < [i] ThenBeginover := FALSE;Exit;End;If [i] > [i] ThenBeginover := TRUE;Exit;End;End;over := FALSE; End;BeginReadln(s);FillChar(, SizeOf(), 0); := Length(s);For i := 1 To [i] := Ord(s[ - i + 1]) - ord(0);FillChar(, SizeOf(), 0); := 1;[1] := 1;right := target;Repeatmiddle := average(left, right);If over(times(middle, middle), target)Then right := middleElse left := middle;Until over(plustwo(left), right);For i := DownTo 1 DoWrite([i]);Writeln;End.

本文原创来源:电气TV网,欢迎收藏本网址,收藏不迷路哦!

相关阅读

添加新评论