日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python socket发送数组_利用pyprocessing初步探索数组排序算法可视化

發布時間:2024/10/8 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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初步探索数组排序算法可视化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。