实现语言:python
实验要求:
(1)普通二进制树搜索:
设计一个1、11、21…标签数目
①先设计一个GUI界面,得到8位二进制数的随机序列,分成256份。
②先对每一次都找出碰撞的最高位;
③选择比碰撞位小的二进制数,然后继续进行第②步骤,直至选择出最小的那一个;
④去除最小的那一行,在进行第二三四步的循环,并记下用时;
⑤画出每一次找到一个标签的运行用时曲线图。
(2)二分支搜索…
原理:
1.普通二进制搜索算法
二进制搜索技术以唯一的序列号来识别射频电子标签为基础。为了从一簇射频电子标签中选择其中之一,射频读写器发出一个读命令,将射频电子标签序列号传输时的数据碰撞引导到射频读写器,即由射频读写器判断是否有碰撞发生。如果有,则进一步搜索。在二进制算法的实现中,起决定作用的是射频读写器所使用的信号编码必须能够确定碰撞发生的准确位置。因此,一般使用可以进行位碰撞检测的曼彻斯特编码发送数据。
前提,读写器并不知道各个标签各自的ID号,只能根据曼彻斯特编码判断有没有碰撞。
在普通二进制算法中,根据所给标签数生成对应的唯一标签ID,并进行普通二进制搜索算法:选取标签的第1位字符,与所假定标签“11111111”的第一位字符进行匹配,如果匹配数为1,则读写器确定匹配,直接和这个标签进行通信,并将其从标签从数组中删去,将匹配字符串和索引index初始化,重新匹配;若匹配到的标签数为0,就将所假定标签“11111111”的第1(n)位取反,然后继续重新匹配;若匹配到的标签数为2,就将需要匹配的字符数+1(本来匹配前n位,现在匹配前n+1位),再次匹配;不断循环,直到标签集合中无标签为止。
流程图如下:
2.二分支搜索
二分支搜索方法采用递归的工作方式,遇到碰撞就随机地进行分支,成为多个子集。在接下来的时隙中,主要解决信息包所发生的碰撞。如果再次发生碰撞,就继续随机地分为多个分支。然后依次进行查询,标签被分支后,由于响应的标签数量减少,再次发生碰撞的概率降低,通过不断的分支,减少响应标签的数量,直至分支内没有或仅有一个标签响应。
在二分支搜索中,不可避免的每一次都要搜索0,1。如果返回的标签数大于2,就进一步递归,将前缀的字符串加上0、1两种方式分别再次递归搜索;如果等于1就被被选中,直接进行通信,如果等于0就直接返回不操作。
普通二进制搜索的python代码如下
import math
import random
import time
from tkinter import *
#tkinter界面设计
root = Tk()
Label(root,text='二进制树仿真').grid(row = 0, column = 1)
Label(root,text = '显示n个标签的识别').grid(row = 1, column = 0, padx = 10, pady = 5)
entry1= Entry(root)
entry1.grid(row = 1, column = 1, padx = 10, pady = 5)
#回调函数
def callback():
n = int(entry1.get())
listbox1.delete(0,END)
listbox2.delete(0,END)
text1.delete(