【CBM666与工控业界的同伙探讨一种算法】
vb吧
全部回复
仅看楼主
level 13
cbm666 楼主
串口每秒采集一次温度 (因为是在特定抽真空的容器内,因此不必考虑突波)
目的是采集每一时间段(600秒)之间 最高与最低温度差必须在0.5度之内 即算是达标区间 结束测试 打印达标的区间 最低几度最高几度
所谓区间段就是 1秒-601秒之间的温度数据 2秒-602秒之间的温度数据
3秒-603秒之间的温度数据 4秒-604秒之间的温度数据.......
我已写好代码 我认为它是个很有效率的算法 但也未必见得, 因此特提出来 供大家探讨 共同求进步为真
2014年06月11日 12点06分 1
level 13
火线留名
2014年06月11日 12点06分 2
本来我可以比你先留名的[撞墙至死]
2014年06月11日 12点06分
level 11
抵制二楼。。。
2014年06月11日 12点06分 3
那字太小了,基本看不清楚。。。。
2014年06月11日 12点06分
回复 骄傲地蚂蚁 :文字说明已够清楚了 要看图片的话 另存为 正常去看图片就大啦
2014年06月11日 12点06分
回复 cbm666 :哦。
2014年06月11日 12点06分
level 8
没有看到源码[滑稽]
2014年06月11日 13点06分 4
level 13
算法代码,
或者测试用数据?
2014年06月11日 13点06分 5
level 13
cbm666 楼主
算法讨论 不需要源码吧 前10分钟就只不停地接收数据 将会有600笔数据 从601秒以后开始每隔一秒就有一笔新数据进来 此时 【正式】开始进入判断
判断 1秒-601秒之间的温度数据 2秒-602秒之间的温度数据
3秒-603秒之间的温度数据 4秒-604秒之间的温度数据...........
一直到某一区间段的最高温度与最低温度差小于0.5度之内 即完成测试。
有可能会在 5000秒-5600秒才会稳定在公差0.5度内 意思就是判断5000次以后才完成测试
有可能180分钟 即10800秒之内 还无法达到 那就算失败 可以点击按钮 重新再来一次
先我原来使用冒泡数组排序每隔一秒判断一次 不是冒泡 而是电脑冒烟了 CPU飙升 哈哈
'数组排序副程序
Public Function PXaz(Arr) As String()
On Error Resume Next
'********************** 由小排到大(冒泡排序法)
Dim TMPSZ$(), T&, k&
ReDim Preserve TMPSZ$(UBound(Arr))
For i = 0 To UBound(Arr)
k = i
For j = i + 1 To UBound(Arr)
If Arr(k) > Arr(j) Then k = j
Next j
T = Arr(i): Arr(i) = Arr(k): Arr(k) = T
TMPSZ(i) = Arr(i)
Next i
PXaz = TMPSZ
End Function
2014年06月11日 14点06分 6
level 12
。。。冒泡。。为啥不用快排@瞿冠中 粗来介绍几种效率高占用少的
2014年06月11日 14点06分 7
介绍归并排序,比快排快
2014年06月11日 14点06分
level 13
cbm666 楼主
数据例如30.1 30.3 30.2 30.5 30.6 30.8......不会差距太远的数据
重点就是 【如何获取每600笔数据最高与最低的算法】
2014年06月11日 14点06分 8
将数据写入数组,for控制下标 step 600 内层循环控制1~600,擂台法求最值
2014年06月11日 14点06分
level 13
cbm666 楼主
谢谢楼上几位朋友
不论啥算法 每种算法必须在一秒内完成 因为每一秒一笔新数据会进来 换句话说 当你在判断1000-1600笔的数据时 第1601笔的数据还不会进来
2014年06月11日 14点06分 9
level 11
如果可以用VB写单片机就太好了,C语言真心难学
2014年06月11日 14点06分 10
level 13
处理5892行,耗时211.974秒,测试数据是产生的11000个逐渐靠近的随机数。
你要1秒处理11000个数据?还是1秒600个?前者的话肯定没招了……
2014年06月11日 15点06分 11
level 13
cbm666 楼主
呵呵 谢谢 一次就处理600笔数据 601笔还没进来呢
2014年06月11日 15点06分 12
level 8
'小白求关注...
貌似你们的方法都有些麻烦,小白隐约觉得有简单方法、、、
2014年06月11日 15点06分 13
你不是小白 因为我现在用的就是小白的方法 不到几毫秒结束 轻松的等着下一笔新数据 CPU占用几乎等于零
2014年06月11日 15点06分
回复 cbm666 :呃呃呃这么快,我低估电脑的能力了。。
2014年06月11日 15点06分
回复 cbm666 :呃呃呃,不懂的说。老师能不能解释一下啊。。。
2014年06月11日 16点06分
回复 李静乙 :恩恩~明白了。。。
2014年06月12日 06点06分
吧务
level 13
冒泡排序?
工业要求的是恒温,锁温。
所以,在收到的数据,开头和结尾比较重要。优先结尾倒序检查。开头和结尾对比差值。
2014年06月11日 17点06分 14
吧务
level 12
我的想法就是简单的没个数比较。大的替换“最大值”小的替换“最小值”最后再作差。就是不知道这种和冒泡比怎么样?没有必要全部都排序吧?
2014年06月11日 17点06分 15
我觉得一秒做不够六百个数据的比较是完全没问题的。
2014年06月11日 17点06分
level 11
看那个冒泡排序好奇怪的样子。不过还是推荐用快排。冒泡太慢,时间复杂度是n^2,快排的最差时间复杂度是n^2,最好的时间复杂度是n log n,总体来讲都要比冒泡快。如果lz对算法有很深的研究的话可以用堆排序,貌似是最快的了。时间复杂度都是n log n。但是很难懂,至少我看不懂。
2014年06月11日 19点06分 16
自省排序。小数据用插排,大数据用快排,递归太深改堆排。
2014年06月12日 10点06分
level 10
只要最高值和最低值?
2014年06月12日 00点06分 17
level 10
这两张算法 哪个快啊
2014年06月12日 00点06分 18
第一个是堆排序,第二个是快速排序。堆排序稍微快一点,堆排序的空间复杂度小,适合极大量的数据处理。快速排序简单,但是要递归,所以不适合极大量数据,不然会容易溢出。两者都是不稳定排序。如果不在乎内存的话可以用归并排序(merge sort),稳定排序,速度也和堆排序,但是空间复杂度巨大。
2014年06月12日 00点06分
回复 Lewis_xy :谢谢啊~~堆排序 有代码么?想看看是怎么样走的
2014年06月12日 01点06分
回复 传说中嘚男人 :堆排序还是挺复杂的,很抱歉具体我也不懂,大概就是建造一个堆,最大的数放最上面,之后依次把小的数往下放。我连堆都不懂,怎么能写得出代码?这两张图太眼熟了,是wikipedia(维基百科)上面的。我看过不下10遍,但是还是没懂堆排序,快速排序我有源码,你要吗?
2014年06月12日 01点06分
回复 Lewis_xy :要~~发来看看
2014年06月12日 01点06分
level 13
cbm666 楼主
呵呵 非常感谢楼上几位同伙的大力相助 谢谢你们
稍晚一点 我公布我的【逻辑】 让你们都跌破眼镜的 【逻辑】
判断600笔数据最大与最小值用时 100--120 毫秒 轻松的等下一笔进来
2014年06月12日 00点06分 19
呵呵,老师,我已经掌握了你的这个秘密排序法。十分感谢啊。
2014年06月12日 08点06分
level 11
@传说中嘚男人
这代码大部分是自己写的,当然是比较字符串,可以把第一个参数改成 as integer,left和right是数组的要排序部分的界限,当然是为了递归的时候好用。
Private Sub quicksort(ByRef s() As String, ByVal left As Integer, ByVal right As Integer)
Dim m, l, r, k As Integer
l = left
r = right
m = s((l + r) / 2)
Do
While s(l) < m
l = l + 1
Wend
While s(r) > m
r = r - 1
Wend
If l <= r Then
k = s(l)
s(l) = s(r)
s(r) = k
l = l + 1
r = r - 1
End If
Loop While l <= r
If left < r Then quicksort s, left, r
If l < right Then quicksort s, l, right
End Sub
2014年06月12日 01点06分 20
谢谢啊~~
2014年06月12日 01点06分
1 2 尾页