python socket发送数组_利用pyprocessing初步探索数组排序算法可视化
【經過兩次更新,功能基本完成】最終效果請直接下拉到最后一個視頻觀看
背景說明
這篇文章旨在初步探索利用pyprocessing的強大的可視化功能,以及pyprocessing和Ipython之間的本地網絡通訊,實現對于Ipython中數組排序的可視化。簡單的說,就是使用pyprocessing做一個程序(服務端),負責數據的存儲以及數據的可視化,然后我們的python程序負責核心排序算法,并通過一個本地網絡端口向其發送指令。當然,這里的python程序也可以是其他任何語言的程序,因為發送到網絡端口的是字節流,而只要字節流符合規定格式,就能夠實現算法的可視化。
算法可視化的基本思想采用了“圖表被動更新”的策略。什么是“被動”呢?就是我們的可視化程序是根據我們發出的指令進行元素交換的,而我們對于圖表發出的指令類似于下面這種:
請交換第二個和第五個數組元素 請交換第七個和第八個數組元素這和現在大多數主動式可視化方式不同:它們是主動綁定一個數組,并在每次更新圖像前掃描數組元素。和這種主動式相比,這里的被動式顯然是更有優點的,比如說:
- 對初學者更加友好。因為初學者對于排序問題經常會寫出遞歸式的解法,這時主動式的可視化方式就會失效。
- 可視化更加靈活。方面調整一些參數,同時使得背景分組染色這種可視化方式變得可能。
另外,關于pyprocessing和Ipython之間的通訊原理請看本專欄的上一篇文章,而軟件的安裝請查看更早期的相關文章。
程序效果
效果展示https://www.zhihu.com/video/1164283402328129536視頻說明:
程序默認產生了一個隨機數組,然后根據客戶端發出的指令進行元素交換操作。
客戶端程序(python)如下:
import socketaddress = ('127.0.0.1', 12345) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(address)s.send(r'13 5'.encode()) # 交換第13個和第5個元素的位置 s.send(r'12 4'.encode()) s.send(r'1 3'.encode()) s.send(r'13 5'.encode()) s.send(r'12 4'.encode()) s.send(r'1 3'.encode())因為現在整個項目正在開發的初期,服務器端程序暫時不公開。歡迎有興趣的同學和作者交流。作者會持續改進該程序,并添加更加豐富的功能。順帶一提,如果文章沒人點贊的話就完全沒有更新的欲望了噢~
2019.10.7 更新
完善了昨天的算法可視化的基本程序。并將指令分成了“init”指令和“swap”指令兩種。
下面是一個基本的客戶端程序:
import time s.send(r'init 1 2 3 4 5 11 10 9'.encode()) time.sleep(0.5) s.send(r'swap 3 5'.encode()) time.sleep(0.5) s.send(r'swap 2 4'.encode()) time.sleep(0.5) s.send(r'swap 2 3'.encode())我們就用上面的基本指令寫一個排序算法的可視化:
import socketaddress = ('127.0.0.1', 12345) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(address)import timedef bubble_sort(alist):for j in range(len(alist)-1,0,-1):# j表示每次遍歷需要比較的次數,是逐漸減小的for i in range(j):if alist[i] > alist[i+1]:alist[i], alist[i+1] = alist[i+1], alist[i]s.send(('swap ' + str(i) + ' ' + str(i+1)).encode())time.sleep(0.5)def insert_sort(alist):# 從第二個位置,即下標為1的元素開始向前插入for i in range(1, len(alist)):# 從第i個元素開始向前比較,如果小于前一個元素,交換位置for j in range(i, 0, -1):if alist[j] < alist[j-1]:alist[j], alist[j-1] = alist[j-1], alist[j]s.send(('swap ' + str(j) + ' ' + str(j-1)).encode())time.sleep(0.5)li = [54,26,93,17,77,31,44,55,20,33,66] s.send(('init ' + ' '.join(str(a) for a in li)).encode())insert_sort(li) print(li)對于插入排序算法的可視化https://www.zhihu.com/video/1164499957758525440可以看出,我們的程序達成了目標效果,運行流暢。
下一步目標是利用processing的分層渲染技術加入更多的可視化信息,比如加入元素標號,展示分組信息,重點突出正在交換的元素等。
2019.10.8更新
- 服務器端程序加入了多行命令解析功能,對應的客戶端程序每條指令的末尾都需要添加一個“*”表示一條指令的結束
- 服務器端程序加入了條條染色功能,對應的指令格式是:”color n time*“,其中n是條的序號,而time是該染色持續的時間(單位:毫秒)
下面是例子調用代碼:
# 連接到服務器 import socket address = ('127.0.0.1', 12345) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(address)import time # 冒泡排序 def bubble_sort(alist):for j in range(len(alist)-1,0,-1):# j表示每次遍歷需要比較的次數,是逐漸減小的for i in range(j):time.sleep(0.6)s.send(('color ' + str(i) + ' ' + '400*').encode()) # 染色可視化指令s.send(('color ' + str(i+1) + ' ' + '400*').encode()) # 染色可視化指令if alist[i] > alist[i+1]:alist[i], alist[i+1] = alist[i+1], alist[i]s.send(('swap ' + str(i) + ' ' + str(i+1)+'*').encode()) # 交換可視化指令 li = [54,26,93,17,77,31,44,55,20,33,66] s.send(('init ' + ' '.join(str(a) for a in li)).encode()) # 可視化初始化指令bubble_sort(li)以及上述調用程序的效果視頻:
對冒泡排序進行可視化https://www.zhihu.com/video/1164857154036174848總結
以上是生活随笔為你收集整理的python socket发送数组_利用pyprocessing初步探索数组排序算法可视化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4大行是那几个
- 下一篇: 股票当日卖出的资金可以转出吗