Add sort codes and notes

This commit is contained in:
mbinary 2018-07-08 16:41:55 +08:00
commit b15dd20c0e
82 changed files with 15965 additions and 0 deletions

2
README.md Normal file
View File

@ -0,0 +1,2 @@
# 算法笔记
记录学习算法的一些笔记, 想法, 以及代码实现 :smiley:

View File

@ -0,0 +1,100 @@
isVisited = [0]*362880 # 0 for not visited,1 for occured,2 for visited
fac = [1,1,2,6,24,120,720,5040,40320]
lf = len(fac)
h = [[0,1,2,1,2,3,2,3,4],
[1,0,1,2,1,2,3,2,3],
[2,1,0,3,2,1,4,3,2],
[1,2,3,0,1,2,1,2,3],
[2,1,2,1,0,1,2,1,2],
[3,2,1,2,1,0,3,2,1],
[2,3,4,1,2,3,0,1,2],
[3,2,3,2,1,2,1,0,1],
[4,3,2,3,2,1,2,1,0]]
def cantor(s):
sum = 0
ls = len(s)
for i in range(ls):
count = 0
for j in range(i+1,ls):
if s[i] > s[j]: count +=1
sum += count*fac[lf-i-1]
return sum
que = []
dir = {-3:'u',1:'r',3:'d',-1:'l'}
class state:
flag = True
def __init__(self,s,x,f,step=0,last=0):
self.x = x
self.s = list(s)
self.step = step
self.path = []
self.last = last
self.f = f
def can(self):
cans = [-1,1,3,-3]
if self.last in cans :
cans.remove(-self.last)
if self.x<3:
cans.remove(-3)
if self.x>5:
cans.remove(3)
if self.x%3 is 0:
cans.remove(-1)
if self.x%3 is 2:
cans.remove(1)
return cans
def move(self):
cans = self.can()
for i in cans:
s = list(self.s)
tmp = self.x + i
s[self.x] = s[tmp]
s[tmp] = '9'
ct = cantor(s)
if isVisited[ct] != 2 :
val = int(s[self.x])
f = h[8][tmp] +h[val-1][self.x]-h[8][self.x]-h[val-1][tmp]+self.step+1
new = state(s,tmp,f,self.step +1,i)
new.path = self.path + [dir[i]]
if isVisited[ct] == 1:
for i,node in enumerate(que):
if mew.s == node.s:
del que[i]
break
else:isVisited[ct] = 1
if que == []:
que.append(new)
continue
for i,node in enumerate(que):
if new.f<=node.f:
que.insert(i,new)
def solvable(s):
reverse = 0
for i in range(8):
if s[i] is '9':continue
for j in range(i+1,9):
if s[i]>s[j]:reverse +=1
if reverse % 2 is 0:return True
else:return False
def getPath(s,index):
f = 0
for i,j in enumerate(s):
f+=h[int(j)-1][i]
que.append(state(s,index,f,0,0))
while que != []:
cur = que.pop(0)
ct = cantor(cur.s)
isVisited[ct] = 2
if ct is 0:
return cur.path
cur.move()
if __name__ == '__main__':
s=input()
index = s.find('x')
s =list(s)
s[index] = '9'
if solvable(s):print(''.join(getPath(s,index)))
else:print('unsolvable')

View File

@ -0,0 +1,61 @@
from colectons import deque
isVisted = [0]*362880
fac = [1,2,6,24,120,720,5040,40320]
lf = len(fac)
x= '9'
def cantor(s):
sum = 0
ls = len(s)
for i in range(ls):
count = 0
for j in range(i+1;ls):
if s[i] > s[j]: count +=1
sum += count*fac[lf-i-1]
return sum
que = deque()
class state:
def __init__(self,s,p,step=0,last=0):
self.x = p
self.s = list(s)
self.step = step
self.path = []
self.last = last
def move(self):
dir = [-3:'u',1:'r',3:'d',-1:'l']
if self.last in dir :
del dir[-self.last]
if self.x<3:
del dir[-3]
if self.x>5:
del dir[3]
if self.x%3 is 0:
del dir[-1]
if self.x%3 is 2:
del dir[1]
for i in dir.keys():
s = list(self.s)
tmp = self.x + i
s[self.x] = s[tmp]
s[tmp] = x
if not isVisted[cantor(s)]:
new = state(s,tmp,self.step +1,i)
new.path = self.path + [dir[i]]
que.append(new)
def getPath(s):
index = s.find('x')
s =list(s)
s[index] = '9'
que.append(state(s,index,0,0))
while que != deque():
cur = que.popleft()
ct = cantor(cur.s)
if ct is 362879:
return cur.path
isVisted[] = 1
cur.move()
if __name__ == '__main__':
s=input()
print(''.join(getPath(s)))

View File

@ -0,0 +1,201 @@
class node:
def __init__(self,val=None,data_mp=None,pre=None,next=None):
self.val=val
self.data_mp = {} if data_mp is None else data_mp
self.pre=pre
self.next=next
def __lt__(self,nd):
return self.val<nd.val
def getOne(self):
if not self.data_mp:
return ''
else:return list(self.data_mp.items())[0][0]
def __getitem__(self,key):
return self.data_mp[key]
def __iter__(self):
return iter(self.data_mp)
def __delitem__(self,key):
del self.data_mp[key]
def __setitem__(self,key,val):
self.data_mp[key]= val
def isEmpty(self):
return self.data_mp=={}
def __repr__(self):
return 'node({},{})'.format(self.val,self.data_mp)
class doubleLinkedList:
def __init__(self):
self.head= self.tail = node(0)
self.head.next = self.head
self.head.pre = self.head
self.chain_mp={0:self.head}
def __str__(self):
li = list(self.chain_mp.values())
li = [str(i) for i in li]
return 'min:{}, max:{}\n'.format(self.head.val,self.tail.val) \
+ '\n'.join(li)
def getMax(self):
return self.tail.getOne()
def getMin(self):
return self.head.getOne()
def addIncNode(self,val):
# when adding a node,inc 1, so it's guranted that node(val-1) exists
self.chain_mp[val].pre= self.chain_mp[val-1]
self.chain_mp[val].next= self.chain_mp[val-1].next
self.chain_mp[val-1].next.pre = self.chain_mp[val-1].next = self.chain_mp[val]
def addDecNode(self,val):
# when adding a node,dec 1, so it's guranted that node(val+1) exists
self.chain_mp[val].next= self.chain_mp[val+1]
self.chain_mp[val].pre= self.chain_mp[val+1].pre
self.chain_mp[val+1].pre.next = self.chain_mp[val+1].pre = self.chain_mp[val]
def addNode(self,val,dec=False):
self.chain_mp[val] = node(val)
if dec:self.addDecNode(val)
else:self.addIncNode(val)
if self.tail.val<val:self.tail = self.chain_mp[val]
if self.head.val>val or self.head.val==0:self.head= self.chain_mp[val]
def delNode(self,val):
self.chain_mp[val].next.pre = self.chain_mp[val].pre
self.chain_mp[val].pre.next = self.chain_mp[val].next
if self.tail.val==val:self.tail = self.chain_mp[val].pre
if self.head.val==val:self.head = self.chain_mp[val].next
del self.chain_mp[val]
def incTo(self,key,val):
if val not in self.chain_mp:
self.addNode(val)
self.chain_mp[val][key] = val
if val!=1 : # key in the pre node
del self.chain_mp[val-1][key]
#print(self.chain_mp[val-1])
if self.chain_mp[val-1].isEmpty():
#print('*'*20)
self.delNode(val-1)
def decTo(self,key,val):
if val not in self.chain_mp:
self.addNode(val,dec=True)
# notice that the headnode(0) shouldn't add key
if val!=0: self.chain_mp[val][key] = val
del self.chain_mp[val+1][key]
if self.chain_mp[val+1].isEmpty():
self.delNode(val+1)
class AllOne:
def __init__(self):
"""
Initialize your data structure here.
"""
self.op = {"inc":self.inc,"dec":self.dec,"getMaxKey":self.getMaxKey,"getMinKey":self.getMinKey}
self.mp = {}
self.dll = doubleLinkedList()
def __str__(self):
return str(self.dll)
def __getitem__(self,key):
return self.mp[key]
def __delitem__(self,key):
del self.mp[key]
def __setitem__(self,key,val):
self.mp[key]= val
def __iter__(self):
return iter(self.mp)
def inc(self, key,n=1):
"""
Inserts a new key <Key> with value 1. Or increments an existing key by 1.
:type key: str
:rtype: void
"""
if key in self:
self[key]+=n
else:self[key]=n
for i in range(n): self.dll.incTo(key, self[key])
def dec(self, key,n=1):
"""
Decrements an existing key by 1. If Key's value is 1, remove it from the data structure.
:type key: str
:rtype: void
"""
if key in self.mp:
mn = min( self[key],n)
for i in range(mn): self.dll.decTo(key, self[key]-i-1)
if self[key] == n:
del self[key]
else:
self[key] = self[key]-n
def getMaxKey(self):
"""
Returns one of the keys with maximal value.
:rtype: str
"""
return self.dll.getMax()
def getMinKey(self):
"""
Returns one of the keys with Minimal value.
:rtype: str
"""
return self.dll.getMin()
if __name__ == '__main__':
ops=["inc","inc","inc","inc","inc","dec","dec","getMaxKey","getMinKey"]
data=[["a"],["b"],["b"],["b"],["b"],["b"],["b"],[],[]]
obj = AllOne()
for op,datum in zip(ops,data):
print(obj.op[op](*datum))
print(op,datum)
print(obj)
'''
None
inc ['a']
min:1, max:1
node(0,{})
node(1,{'a': 1})
None
inc ['b']
min:1, max:1
node(0,{})
node(1,{'a': 1, 'b': 1})
None
inc ['b']
min:1, max:2
node(0,{})
node(1,{'a': 1})
node(2,{'b': 2})
None
inc ['b']
min:1, max:3
node(0,{})
node(1,{'a': 1})
node(3,{'b': 3})
None
inc ['b']
min:1, max:4
node(0,{})
node(1,{'a': 1})
node(4,{'b': 4})
None
dec ['b']
min:1, max:3
node(0,{})
node(1,{'a': 1})
node(3,{'b': 3})
None
dec ['b']
min:1, max:2
node(0,{})
node(1,{'a': 1})
node(2,{'b': 2})
b
getMaxKey []
min:1, max:2
node(0,{})
node(1,{'a': 1})
node(2,{'b': 2})
a
getMinKey []
min:1, max:2
node(0,{})
node(1,{'a': 1})
node(2,{'b': 2})
'''

View File

@ -0,0 +1,126 @@
from collections import Iterable
class node:
def __init__(self,val,freq=1):
self.val=val
self.freq = freq
def __eq__(self,a):
return self.val == a.val
def __lt__(self,a):
return self.val<a.val
def __le__(self,a):
return self.val<=a.val
def __gt__(self,a):
return self.val>a.val
def __ge__(self,a):
return self.val>=a.val
def __ne__(self,a):
return not self == a
class binaryHeap:
def __init__(self,s=None,sortByFrequency = False,reverse=False):
self.sortByFrequency=sortByFrequency
self.reverse = reverse
self.data = [node(0)] # make index begin with 1
if s==None:return
if not isinstance(s,Iterable):s = [s]
for i in s:
self.insert(i)
def __bool__(self):
return len(self)!=1
def _cmp(self,a,b):
if self.sortByFrequency:
if self.reverse:return a.freq>b.freq
else:return a.freq<b.freq
else:
if self.reverse:return a>b
else:return a<b
def insert(self,k):
if not isinstance(k,node): k = node(k)
for j in range(self.data[0].val):
i = self.data[j+1]
if i==k:
i.freq+=1
if self.sortByFrequency:
idx = self.percolateDown(j+1)
self.percolateUp(idx)
return
self.data.append(k)
self.data[0].val += 1
self.percolateUp()
def percolateUp(self,n=None):
if n ==None:n=self.data[0].val
tmp = self.data[n]
while n!=1 and self._cmp(tmp,self.data[n//2]):
self.data[n] = self.data[n//2]
n = n//2
self.data[n] = tmp
def deleteTop(self):
tmp = self.data[1]
i = self.percolateDown(1)
self.data[i] = self.data[-1]
self.data[0].val-= 1
del self.data[-1]
return tmp
def percolateDown(self,i):
tmp = self.data[i]
while self.data[0].val>=2*i+1:
if self._cmp(self.data[i*2],self.data[2*i+1]):
self.data[i] = self.data[2*i]
i = 2*i
else:
self.data[i] = self.data[2*i+1]
i = 2*i+1
self.data[i] = tmp
return i
def __len__(self):
return self.data[0].val
def Nth(self,n=1):
tmp = []
for i in range(n):
tmp.append(self.deleteTop())
for i in tmp:
self.insert(i)
return tmp[-1]
def display(self):
val =self.data[0].val+1
if self.sortByFrequency:
info='heapSort by Frequency:'
else:info = 'heapSort by Value:'
if self.reverse:
info +=' From big to small'
else:info +=' From small to big'
print('*'*15)
print(info)
print('total items:%d\nval\tfreq'%(val-1))
fmt = '{}\t{}'
for i in range(1,val):
print(fmt.format(self.data[i].val,self.data[i].freq))
print('*'*15)
class Test:
def topKFrequent(self, words, k):
hp = binaryHeap(sortByFrequency = True,reverse=True)
for i in words:
hp.insert(i)
hp.display()
n = len(hp)
mp = {}
while hp:
top = hp.deleteTop()
if top.freq in mp:
mp[top.freq].append(top.val)
else:
mp[top.freq] = [top.val]
for i in mp:
mp[i].sort()
key = sorted(mp.keys(),reverse = True)
rst = []
count = 0
for i in key:
for j in mp[i]:
rst.append(j)
count+=1
if count == k:return rst
if __name__ == '__main__':
s=["plpaboutit","jnoqzdute","sfvkdqf","mjc","nkpllqzjzp","foqqenbey","ssnanizsav","nkpllqzjzp","sfvkdqf","isnjmy","pnqsz","hhqpvvt","fvvdtpnzx","jkqonvenhx","cyxwlef","hhqpvvt","fvvdtpnzx","plpaboutit","sfvkdqf","mjc","fvvdtpnzx","bwumsj","foqqenbey","isnjmy","nkpllqzjzp","hhqpvvt","foqqenbey","fvvdtpnzx","bwumsj","hhqpvvt","fvvdtpnzx","jkqonvenhx","jnoqzdute","foqqenbey","jnoqzdute","foqqenbey","hhqpvvt","ssnanizsav","mjc","foqqenbey","bwumsj","ssnanizsav","fvvdtpnzx","nkpllqzjzp","jkqonvenhx","hhqpvvt","mjc","isnjmy","bwumsj","pnqsz","hhqpvvt","nkpllqzjzp","jnoqzdute","pnqsz","nkpllqzjzp","jnoqzdute","foqqenbey","nkpllqzjzp","hhqpvvt","fvvdtpnzx","plpaboutit","jnoqzdute","sfvkdqf","fvvdtpnzx","jkqonvenhx","jnoqzdute","nkpllqzjzp","jnoqzdute","fvvdtpnzx","jkqonvenhx","hhqpvvt","isnjmy","jkqonvenhx","ssnanizsav","jnoqzdute","jkqonvenhx","fvvdtpnzx","hhqpvvt","bwumsj","nkpllqzjzp","bwumsj","jkqonvenhx","jnoqzdute","pnqsz","foqqenbey","sfvkdqf","sfvkdqf"]
test = Test()
print(test.topKFrequent(s,5))

View File

@ -0,0 +1,46 @@
class bit
{
int n;
int *p;
public:
bit(int *,int);
~bit();
int init(int,int,bool);
int getSum(int a,int b){return getSum(a)-getSum(b)};
int getSum(int);
void update(int,int);
};
bit::bit(int *a,int j)
{
p=new int[j+1];
n=j;
for (int i=0;i<n ;++i )p[i+1]=a[i] ;
int i;
while(i<n)i*=2;
init(1,i,true);
}
int bit::init(int a,int b,bool isLeft)
{
if(a==b)return p[k];
int l=init(a,(a+b)/2,true);
int r=init((a+b)/2+1,b,false);
if(isLeft)p[b]=l+r;
return p[b];
}
int bit::getSum(int a)
{
int rst=0;
while(a!=0){
rst+=p[a];
a-=a&-a;
}
return rst;
}
void bit::update(int i , int x)
{
int delta=x-p[i]
while(i<n){
p[i] = delta;
i+=i&-i;
}
}

View File

@ -0,0 +1,72 @@
from functools import total_ordering
@total_ordering
class node:
def __init__(self,val,left=None,right=None,freq = 1):
self.val=val
self.left=left
self.right=right
self.freq = freq
def __lt__(self,nd):
return self.val<nd.val
def __eq__(self,nd):
return self.val==nd.val
def __repr__(self):
return 'node({})'.format(self.val)
class binaryTree:
def __init__(self):
self.root=None
def add(self,val):
def _add(nd,newNode):
if nd<newNode:
if nd.right is None:nd.right = newNode
else:_add(nd.right,newNode)
elif nd>newNode:
if nd.left is None:nd.left = newNode
else : _add(nd.left,newNode)
else:nd.freq +=1
_add(self.root,node(val))
def find(self,val):
prt= self._findPrt(self.root,node(val),None)
if prt.left and prt.left.val==val:
return prt.left
elif prt.right and prt.right.val==val:return prt.right
else :return None
def _findPrt(self,nd,tgt,prt):
if nd==tgt or nd is None:return prt
elif nd<tgt:return self._findPrt(nd.right,tgt,nd)
else:return self._findPrt(nd.left,tgt,nd)
def delete(self,val):
prt= self._findPrt(self.root,node(val),None)
if prt.left and prt.left.val==val:
l=prt.left
if l.left is None:prt.left = l.right
elif l.right is None : prt.left = l.left
else:
nd = l.left
while nd.right is not None:nd = nd.right
nd.right = l.right
prt.left = l.left
elif prt.right and prt.right.val==val:
r=prt.right
if r.right is None:prt.right = r.right
elif r.right is None : prt.right = r.left
else:
nd = r.left
while nd.right is not None:nd = nd.right
nd.right = r.right
prt.left = r.left
def preOrder(self):
def _p(nd):
if nd is not None:
print(nd)
_p(nd.left)
_p(nd.right)
_p(self.root)
if __name__=="__main__":
t = binaryTree()
for i in range(10):
t.add((i-4)**2)
t.preOrder()

View File

@ -0,0 +1,24 @@
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
float f;
while(cin.peek()!='E'){
cin>>f;
getchar();
bool flag=true;
for(int i=0;i<50&&(f-0.0000001)>0;++i){
int t=3*f;
f=3*f-t;
cout<<f<<endl;
if(t==1){
cout<<"NON-MEMBER"<<endl;
flag = false;
break;
}
}
if(flag)cout<<"MEMBER"<<endl;
}
}

View File

@ -0,0 +1,208 @@
from collections import Iterable,deque
class vertex:
def __init__(self,mark,firstEdge=None,val=None):
self.mark = mark
self.val = val
self.firstEdge = firstEdge
self.isVisited = False
def __str__(self):
return 'V'+str(self.mark)
def __repr__(self):
return str(self)
class edge:
def __init__(self,adjVertexs, weight = 1,nextEdge=None):
'''adjVertexs:tuple(v.mark,u.mark)'''
self.weight = weight
self.adjVertexs = adjVertexs
self.nextEdge = nextEdge
self.isVisted = False
def __add__(self,x):
return self.weight +x
def __radd__(self,x):
return self+x
def __getitem__(self,k):
if k!=0 or k!=1:raise IndexError
return self.adjVertexs[k]
def __str__(self):
return '--'+str(self.weight)+'--'
def __repr__(self):
return str(self)
@property
def v(self):
return self.adjVertexs[0]
@property
def u(self):
return self.adjVertexs[1]
class graph:
def __init__(self):
self.vertexs = {}
self.edges = {}
def __getitem__(self,i):
return self.vertexs[i]
def __setitem__(selfi,x):
self.vertexs[i]= x
def __iter__(self):
return iter(self.vertexs)
def __bool__(self):
return len(self.vertexs)!=0
def addVertex(self,vertexs):
'''vertexs is a iterable or just a mark that marks the vertex,whichc can be every imutable type'''
if not isinstance(vertexs,Iterable):vertexs=[vertexs]
for i in vertexs:
if not isinstance(i,vertex) and i not in self.vertexs:self.vertexs[i]= vertex(i)
if isinstance(i,vertex) and i not in self.vertexs:self.vertexs[i.mark]= i
def __getVertex(self,v):
if not isinstance(v,vertex):
if v not in self.vertexs:
self.vertexs[v]=vertex(v)
return self.vertexs[v]
return v
def addEdge(self,v,u,weight = 1):
v = self.__getVertex(v)
u = self.__getVertex(u)
arc = self.findEdge(v,u)
if arc!=None:return #examine that if v,u have been already connected
vertexs = (v,u)
newEdge = edge (vertexs,weight)
self.edges[vertexs] = newEdge
if v.firstEdge==None:
v.firstEdge=newEdge
else:
arc=v.firstEdge.nextEdge
v.firstEdge=newEdge
def findEdge(self,v,u):
v = self.__getVertex(v)
u = self.__getVertex(u)
arc = v.firstEdge
while arc!=None and u not in arc:
arc = arc.nextEdge
if arc!=None:return arc
arc = u.firstEdge
while arc!=None and v not in arc:
arc = arc.nextEdge
return arc
def delEdge(self,v,u):
if not isinstance(v,vertex):v= self.vertexs[v]
if not isinstance(u,vertex):u= self.vertexs[u]
if u in v.firstEdge:
v.firstEdge =v.firstEdge.nextEdge
else:
arc = v.firstEdge
while arc.nextEdge!=e:
arc = arc.nextEdge
if arc!=None: arc.nextEdge = arc.nextEdge.nextEdge
else:
if v in u.firstEdge:
u.firstEdge =u.firstEdge.nextEdge
else:
arc = u.firstEdge
while arc.nextEdge!=e:
arc = arc.nextEdge
arc.nextEdge = arc.nextEdge.nextEdge
del self.edges[(v,u)]
def revisit(self):
for i in self.vertexs.values():
i.isVisited = False
for i in self.edges.values():
i.isVisited = False
def __str__(self):
arcs= list(self.edges.keys())
arcs=[str(i[0])+str(self.edges[i])+str(i[1]) for i in arcs]
s= '\n'.join(arcs)
return s
def __repr__(self):
return str(self)
def minPath(self,v,u):
if v not in self or u not in self:return -1
v=self.__getVertex(v)
u=self.__getVertex(u)
q=deque([v])
last={i:None for i in self.vertexs.values()}
last[v] = 0
ds={i:1000000 for i in self.vertexs.values()}
ds[v]=0
while len(q)!=0:
nd = q.popleft()
nd.isVisited=True
arc = nd.firstEdge
while arc!=None:
tgt=None
if arc.v==nd:
tgt = arc.u
else:tgt = arc.v
tmp=ds[nd]+arc
if ds[tgt] >tmp:
ds[tgt]=tmp
last[tgt] = nd
if not tgt.isVisited:q.append(tgt)
'''
cur = u
while cur !=v:
print(str(cur)+'<---',end='')
cur =last[cur]
print(str(v))
'''
return ds[u]
def hasCircle(self):
pass
def display(self):
print('vertexs')
for i in self.vertexs:
print(i)
print('edges')
for i in self.edges:
arc=self.edges[i]
print(str(arc.v)+str(arc)+str(arc.u))
if __name__=='__main__':
n=int(input())
while n>0:
cities=int(input())
n-=1
g=graph()
li={}
for i in range(cities):
li[input()]=i+1
arc=int(input())
for j in range(arc):
s=input().split(' ')
g.addEdge(i+1,int(s[0]),int(s[1]))
ct =int(input())
for i in range(ct):
line = input()
line= line .split(' ')
v,u = li[line[0]],li[line[1]]
print(g.minPath(v,u))
g.revisit()
#http://www.spoj.com/submit/SHPATH/id=20525991
'''
1
4
gdansk
2
2 1
3 3
bydgoszcz
3
1 1
3 1
4 4
torun
3
1 3
2 1
4 1
warszawa
2
2 4
3 1
2
gdansk warszawa
bydgoszcz warszawa
V4<---V3<---V2<---V1
3
V4<---V3<---V2
2
>>>
'''

View File

@ -0,0 +1,236 @@
from collections import Iterable,deque
class vertex:
def __init__(self,mark,val=None ,firstEdge = None):
self.mark = mark
self.val = val
self.firstEdge = firstEdge
self.isVisited = False
def __str__(self):
if '0'<=self.mark[0]<='9':return 'v'+str(self.mark)
return str(self.mark)
def __repr__(self):
li=[]
arc= self.firstEdge
while arc!=None:
li.append(arc)
arc= arc.outNextEdge
return str(self)+ ' to:'+str([str(i.inArrow) for i in li])
class edge:
def __init__(self,outArrow,inArrow,outNextEdge = None,inNextEdge = None, weight = 1):
self.weight = weight
self.inNextEdge = inNextEdge
self.outNextEdge = outNextEdge
self.outArrow = outArrow
self.inArrow=inArrow
self.isVisited = False
def __str__(self):
return '--'+str(self.weight)+'-->'
def __repr__(self):
return str(self)
class graph:
def __init__(self):
self.vertexs = {}
self.edges = {}
def __getitem__(self,i):
return self.vertexs[i]
def __setitem__(selfi,x):
self.vertexs[i]= x
def __iter__(self):
return iter(self.vertexs.values())
def __bool__(self):
return len(self.vertexs)!=0
def addVertex(self,vertexs):
'''vertexs is a iterable or just a mark that marks the vertex,whichc can be every imutable type'''
if not isinstance(vertexs,Iterable):vertexs=[vertexs]
for i in vertexs:
if not isinstance(i,vertex) and i not in self.vertexs:self.vertexs[i]= vertex(i)
if isinstance(i,vertex) and i not in self.vertexs:self.vertexs[i.mark]= i
def isConnected(self,v,u):
v = self.__getVertex(v)
u = self.__getVertex(u)
arc= v.firstEdge
while arc!=None:
if arc.inArrow==u:return True
arc = arc.inNextEdge
return False
def __getVertex(self,v):
if not isinstance(v,vertex):
if v not in self.vertexs:
self.vertexs[v]=vertex(v)
return self.vertexs[v]
return v
def addEdge(self,v,u,weight = 1):
v = self.__getVertex(v)
u = self.__getVertex(u)
arc = v.firstEdge
while arc!=None: #examine that if v,u have been already connected
if arc.inArrow==u: return
arc= arc.outNextEdge
newEdge = edge(v,u,v.firstEdge,u.firstEdge,weight)
self.edges[(v.mark,u.mark)] = newEdge
v.firstEdge = newEdge
def delEdge(self,v,u):
if not isinstance(v,vertex):v= self.vertexs[v]
if not isinstance(u,vertex):u= self.vertexs[u]
self._unrelated(v,u)
del self.edges[(v.mark,u.mark)]
def _unrelated(self,v,u):
if v.firstEdge==None:return
if v.firstEdge.inArrow == u:
v.firstEdge =v.firstEdge.outNextEdge
else:
arc = v.firstEdge
while arc.outNextEdge!=None:
if arc.outNextEdge.inArrow ==u:
arc.outNextEdge = arc.outNextEdge.outNextEdge
break
def revisit(self):
for i in self.vertexs:
self.vertexs[i].isVisited=False
for i in self.edges:
self.edges[i].isVisited=False
def __str__(self):
arcs= list(self.edges.keys())
arcs=[str(i[0])+'--->'+str(i[1])+' weight:'+str(self.edges[i].weight) for i in arcs]
s= '\n'.join(arcs)
return s
def __repr__(self):
return str(self)
def notIn(self,v):
if (isinstance(v,vertex) and v.mark not in self.vertexs) or v not in self.vertexs:
return True
return False
def visitPath(self,v,u):
'''bfs'''
if self.notIn(v) or self.notIn(u):
return None,None
v = self.__getVertex(v)
u = self.__getVertex(u)
if v.firstEdge==None:return None,None
q=deque([v.firstEdge])
isFind=False
vs,es=[],[]
while len(q)!=0:
vs,es=[],[]
arc= q.popleft()
if arc.outNextEdge!=None and not arc.outNextEdge.isVisited:q.append(arc.outNextEdge)
while arc!=None:
if arc.isVisited:break
arc.isVisited=True
es.append(arc)
vs.append(arc.inArrow)
arc.outArrow.isVisited=True
if arc.inArrow==u:
isFind=True
break
arc = arc.inArrow.firstEdge
# very important , avoid circle travel
while arc.inArrow.isVisited and arc.outNextEdge:arc = arc.outNextEdge
if isFind:break
else:return None,None
'''
se = [str(i) for i in es]
sv = [str(i) for i in vs]
print(str(v),end='')
for i,j in zip(se,sv):
print(i,j,end='')
'''
return vs,es
def hasVertex(self,mark):
return mark in self.vertexs
def display(self):
print('vertexs')
for i in self.vertexs:
print(self.vertexs[i].__repr__())
print('edges')
for i in self.edges:
arc=self.edges[i]
print(str(arc.outArrow)+str(arc)+str(arc.inArrow))
class Solution(object):
def calcEquation(self, equations, values, queries):
"""
:type equations: List[List[str]]
:type values: List[float]
:type queries: List[List[str]]
:rtype: List[float]
"""
rst =[]
g= graph()
for edge,wt in zip(equations,values):
g.addEdge(edge[0],edge[1],wt)
g.addEdge(edge[1],edge[0],1/wt)###### to serach quickly but sacrifacing some space
g.display()
for i in queries:
if i[0]==i[1]:
if i[0] in g.vertexs:rst.append(1.0)
else:rst.append(-1.0)
continue
_,path = g.visitPath(i[0],i[1])
if path==None:
if not path:rst.append(-1.0)
else:
mul = 1
for i in path:mul*=i.weight
rst.append(mul)
g.revisit()
return rst
if __name__=='__main__':
equations = [["a","b"],["e","f"],["b","e"]]
values = [3.4,1.4,2.3]
queries = [["b","a"],["a","f"],["f","f"],["e","e"],["c","c"],["a","c"],["f","e"]]
sol = Solution()
ret=sol.calcEquation( equations, values, queries)
print(ret)
'''
[0.29411764705882354, 10.947999999999999, 1.0, 1.0, -1.0, -1.0, 0.7142857142857143]
'''
'''
equations = [ ["a", "b"], ["b", "c"] ]
values = [2.0, 3.0]
queries = [ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ]
sol = Solution()
ret=sol.calcEquation( equations, values, queries)
print(ret)
'''
'''
[6.0, 0.5, -1.0, -1.0, -1.0]
'''
'''
g = graph()
g.addEdge(1,2)
g.addEdge(2,1)
g.addEdge(3,1)
g.addEdge(1,4)
g.addEdge(3,2)
g.addEdge(2,4)
g.addVertex(6)
g.addEdge(4,6)
g.delEdge(1,2)
g.display()
g.visitPath(3,6)
'''
'''
vertexs
v1 to:['v4']
v2 to:['v4', 'v1']
v3 to:['v2', 'v1']
v4 to:['v6']
v6 to:[]
edges
v2--1-->v1
v3--1-->v1
v1--1-->v4
v3--1-->v2
v2--1-->v4
v4--1-->v6
>>>
'''

View File

@ -0,0 +1,173 @@
#include<iostream>
#include<vector>
#include<algorithm>
#include<list>
bool LOG=false;
using namespace std;
class edge;
class vertex
{
friend ostream &operator<<(ostream&,const vertex *);
friend ostream &operator<<(ostream&,const edge *);
friend class graph;
friend class edge;
public:
vertex(int n,edge* arc = NULL):val(n),firstEdge(arc){isVisited=false;}
~vertex(){if(LOG)cout<<"V"<<val+1<<" is dead "<<endl;}
private:
bool isVisited;
int val ;
edge* firstEdge;
};
class edge
{
friend ostream &operator<<(ostream&,const edge *);
friend ostream &operator<<(ostream&,const vertex *);
friend class graph;
friend class vertex;
public:
edge(vertex * vo,vertex *vi,int w=1,edge *next=NULL):\
out(vo),in(vi),weight(w),nextEdge(next){isVisited=false;}
~edge(){}
private:
bool isVisited;
int weight;
vertex * in,*out;
edge* nextEdge;
};
class graph
{
private:
int vNum,eNum;
vector<vertex*> vs;
vector<edge*> es;
bool weighted;
bool directed;
public:
graph():vNum(0),eNum(0),weighted(false),directed(false){}
graph(int ,int,bool,bool);
~graph();
void getData();
void display();
int minPath(int , int );
void reVisitVertex(){for (int i=0;i<vNum ;vs[i++]->isVisited=false ) ;}
void reVisitEdge(){for (int i=0;i<eNum ;es[i++]->isVisited=false ) ;}
};
graph::graph(int n,int m,bool weighted,bool directed)\
:vNum(n),eNum(m),weighted(weighted),directed(directed)
{
cin.ignore(1);
for (int i=0;i<vNum ;++i ) vs.push_back(new vertex(i)) ;
int a,b,w=1;
for (int i=0;i<eNum ;++i ){
cin >>a >>b;
--a,--b;
if(weighted)cin>>w;
edge *arc=new edge (vs[a],vs[b],w,vs[a]->firstEdge);
vs[a]->firstEdge = arc;
es.push_back(arc);
}
}
ostream& operator<<(ostream& os,const vertex* v)
{
os<<"V"<<v->val+1<<" -->";
edge *arc= v->firstEdge;
while(arc){
os<<" V"<<arc->in->val+1;
arc=arc->nextEdge;
}
return os;
}
ostream& operator<<(ostream& os,const edge* e)
{
os<<"V"<<e->out->val+1<<"--"<<e->weight<<"-->"<<e->in->val+1;
return os;
}
graph::~graph()
{
for (int i=0;i<vNum ;++i ){
edge *arc = vs[i]->firstEdge;
while(arc){
edge *p=arc;
arc=arc->nextEdge;
delete p;
}
delete vs[i];
}
}
void graph::display()
{
cout<<"-----VERTEXS-----"<<endl;
for(int i = 0;i<vs.size();cout<<vs[i]<<endl,++i);
cout<<"------EDGES------"<<endl;
for (int i=0;i<eNum ;cout<<es[i]<<endl,++i ) ;
}
int graph::minPath(int v,int u)
{
vertex *p= vs[v-1],*q= vs[u-1];
vector<vertex*> last; // can't initialize with n NULL ptr
for (int i=0;i<vNum ;last.push_back(NULL),++i ) ;
vector<int> distnace(vNum,-1);
distnace[p->val] = 0;
list<vertex*> que;
que.push_back(p);
while(!que.empty()){
vertex * cur = que.front();
que.pop_front();
cur->isVisited = true;
edge *arc = cur->firstEdge;
while(arc){
vertex * tmp=arc->in;
if(! tmp->isVisited){
que.push_back(tmp);
int sum = arc->weight+distnace[arc->out->val];
if(distnace[tmp->val]==-1){
distnace[tmp->val]= sum;
last[tmp->val] = arc->out;
}
else if(distnace[tmp->val]>sum){
distnace[tmp->val] = sum;
last[tmp->val] = arc->out;
}
}
arc = arc->nextEdge;
}
}
cout<<"path V"<<v<<" to V"<<u<<"\n";
vertex *cur = q;
while(cur&& last[cur->val]!=p ){
cout<<"V"<<cur->val+1<<"<--";
cur = last[cur->val];
}
reVisitVertex();
if(! cur) {
cout.clear();
cout<<"there isn't path from V"<<v<<" to V"<<u<<endl;
return -1;
}
cout<<endl;
return distnace[u-1];
}
int main()
{
int n,m ;
bool weighted,directed;
cout<<"weighted ? [y/N] :";
if(cin.get()=='y') weighted = true;
else weighted=false;
cin.ignore(1);
cout<<"directed ? [y/N] :";
if(cin.get()=='y') directed= true;
else directed= false;
cout<<"input vertex num and edge num"<<endl;
cin>>n>>m;
graph g=graph(n,m,weighted,directed);
g.display();
return 0;
}

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,186 @@
from collections import Iterable,deque
class vertex:
def __init__(self,mark,val=None):
self.mark = mark
self.val = val
self.edges = {}
self.isVisited = False
def __getitem__(self,adjVertexMark):
return self.edges[adjVertexMark]
def __delitem__(self,k):
del self.edges[k]
def __iter__(self):
return iter(self.edges.values())
def __str__(self):
return 'V'+str(self.mark)
def __repr__(self):
return str(self)
class edge:
def __init__(self,adjVertexs, weight = 1):
'''adjVertexs:tuple(v.mark,u.mark)'''
self.weight = weight
self.adjVertexs = adjVertexs
self.isVisted = False
def __add__(self,x):
return self.weight +x
def __radd__(self,x):
return self+x
def __getitem__(self,k):
if k!=0 or k!=1:raise IndexError
return self.adjVertexs[k]
def __str__(self):
return '--'+str(self.weight)+'--'
def __repr__(self):
return str(self)
@property
def v(self):
return self.adjVertexs[0]
@property
def u(self):
return self.adjVertexs[1]
class graph:
def __init__(self):
self.vertexs = {}
self.edges = {}
def __getitem__(self,i):
return self.vertexs[i]
def __setitem__(selfi,x):
self.vertexs[i]= x
def __iter__(self):
return iter(self.vertexs)
def __bool__(self):
return len(self.vertexs)!=0
def addVertex(self,vertexs):
'''vertexs is a iterable or just a mark that marks the vertex,whichc can be every imutable type'''
if not isinstance(vertexs,Iterable):vertexs=[vertexs]
for i in vertexs:
if not isinstance(i,vertex) and i not in self.vertexs:self.vertexs[i]= vertex(i)
if isinstance(i,vertex) and i not in self.vertexs:self.vertexs[i.mark]= i
def __getVertex(self,v):
if not isinstance(v,vertex):
if v not in self.vertexs:
self.vertexs[v]=vertex(v)
return self.vertexs[v]
return v
def addEdge(self,v,u,weight = 1):
v = self.__getVertex(v)
u = self.__getVertex(u)
for arc in v:
if u in arc.adjVertexs:return #examine that if v,u have been already connected
vertexs = (v,u)
newEdge = edge (vertexs,weight)
self.edges[vertexs] = newEdge
v.edges[u] = newEdge
u.edges[v] = newEdge
def delEdge(self,v,u):
if not isinstance(v,vertex):v= self.vertexs[v]
if not isinstance(u,vertex):u= self.vertexs[u]
try:
del v[u]
del u[v]
except:print("error!"+str(v)+','+str(u)+' arent adjacent now')
del self.edges[(v,u)]
def revisit(self):
for i in self.vertexs.values():
i.isVisited = False
for i in self.edges.values():
i.isVisited = False
def __str__(self):
arcs= list(self.edges.keys())
arcs=[str(i[0])+str(self.edges[i])+str(i[1]) for i in arcs]
s= '\n'.join(arcs)
return s
def __repr__(self):
return str(self)
def minPath(self,v,u):
v=self.__getVertex(v)
u=self.__getVertex(u)
q=deque([v])
last={i:None for i in self.vertexs.values()}
last[v] = 0
ds={i:1000000 for i in self.vertexs.values()}
ds[v]=0
while len(q)!=0:
nd = q.popleft()
nd.isVisited=True
for edge in nd:
tgt=None
if edge.v==nd:
tgt = edge.u
else:tgt = edge.v
tmp=ds[nd]+edge
if ds[tgt] >tmp:
ds[tgt]=tmp
last[tgt] = nd
if not tgt.isVisited:q.append(tgt)
'''
cur = u
while cur !=v:
print(str(cur)+'<---',end='')
cur =last[cur]
print(str(v))
'''
return ds[u]
def hasCircle(self):
pass
def display(self):
print('vertexs')
for i in self.vertexs:
print(i)
print('edges')
for i in self.edges:
arc=self.edges[i]
print(str(arc.v)+str(arc)+str(arc.u))
if __name__=='__main__':
n=int(input())
while n>0:
cities=int(input())
n-=1
g=graph()
li={}
for i in range(cities):
li[input()]=i+1
arc=int(input())
for j in range(arc):
s=input().split(' ')
g.addEdge(i+1,int(s[0]),int(s[1]))
ct =int(input())
for i in range(ct):
line = input()
line= line .split(' ')
v,u = li[line[0]],li[line[1]]
print(g.minPath(v,u))
g.revisit()
#http://www.spoj.com/submit/SHPATH/id=20525991
'''
1
4
gdansk
2
2 1
3 3
bydgoszcz
3
1 1
3 1
4 4
torun
3
1 3
2 1
4 1
warszawa
2
2 4
3 1
2
gdansk warszawa
bydgoszcz warszawa
V4<---V3<---V2<---V1
3
V4<---V3<---V2
2
>>>
'''

View File

@ -0,0 +1,364 @@
#include<math.h>
#include<stdio.h>
#include<direct.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<windows.h>
#include<iomanip>
#include<string>
#include<vector>
#include<queue>
#define numDigit 10
#define nameLength 50
#define starNum 80
using namespace std;
void cat(string s)
{
FILE* f=fopen(s.c_str(),"rb");
cout<<"file content"<<endl;
while(!feof(f)){
cout<<fgetc(f);
}
cout<<endl;
}
string uniFileName(string file)
{
FILE * check = fopen(file.c_str(),"rb");
if(check){
char c;
cout<<"the file "<<file<<" already exists! continue? [Y/n]:"<<flush;
c=cin.get();
if(c=='n')exit(0);
int p,q;
p= file.find('(');
q=file.rfind('.');
if(q==string::npos)q=file.size();
if(p==string::npos)p=q;
string name=file.substr(0,p),suffix=file.substr(q,file.size());
int n=0;
while(true){
char s[3];
n+=1;
itoa(n,s,10);
file=(name+"("+s+")"+suffix);
FILE* f=fopen(file.c_str(),"rb");
if(!f)break;
else fclose(f);
}
}
return file;
}
template<class t1, class t2>
void mapprint(map<t1,t2> &f)
{
for(class map<t1,t2>::iterator i = f.begin();i!=f.end();++i)
cout<<i->first<<") : "<<i->second<<endl;
}
template<typename ky,typename wt>
class node
{
public:
ky key;
wt val;
bool visited;
node * left,*right;
node(const node &a){val = a.val;key= a.key;visited = a.visited;left= a.left;right=a.right;}
node(ky k=0,wt v=0):key(k),val(v),visited(false),left(NULL),right(NULL){};
bool operator<(const node<ky,wt> & a)const{return val>a.val;};
};
template<typename ky,typename wt>
class huffman
{
private:
node<ky,wt> root;
string res;
public:
long total(){return root.val;}
map<ky,string> encode_map;
map<string,ky> decode_map;
huffman(map<ky,wt>& mp);
void display();
string encode(string,long &);
string decode(string,long&);
void preOrder(node<ky,wt>*,string);
};
template<typename ky,typename wt>
huffman<ky,wt>::huffman(map<ky,wt>& mp)
{
if(mp.empty()){
cout<<"Error! No data!"<<endl;
root=NULL;
return ;
}
priority_queue<node<ky,wt> > hp;
for(typename map<ky,wt>::iterator i=mp.begin();i!=mp.end();++i){
hp.push( node<ky,wt>(i->first,i->second));
}
int n =hp.size();
if(n==1){
root = hp.top();
return;
}
while(--n>=1){
node<ky,wt> *a = new node<ky,wt>(hp.top());
hp.pop();
node<ky,wt> *b = new node<ky,wt>(hp.top());
hp.pop();
node<ky,wt> * tmp = new node<ky,wt>(0,a->val+b->val);
tmp->left = a,tmp->right = b;
hp.push(*tmp);
}
root = hp.top();
preOrder(&root,string());
}
template<typename ky,typename wt>
void huffman<ky,wt>::preOrder(node<ky, wt>* nd,string s)
{
if(nd->left == NULL){
encode_map[nd->key] =s;
decode_map[s] = nd->key;
delete nd;
return ;
}
preOrder(nd->left,s+'0');
preOrder(nd->right,s+'1');
delete nd;
}
template<typename ky,typename wt>
string huffman<ky,wt>::decode(string zipfile_name,long &charNum)
{
string uniFileName(string);
FILE * src = fopen(zipfile_name.c_str(),"rb");
char file_name[nameLength];
fgets(file_name,nameLength,src);
int ct=-1;
while(file_name[++ct]!='\n');
int pos = zipfile_name.find('.');
if(pos==string::npos)pos=zipfile_name.size();
string name(zipfile_name.substr(0,pos)) ,suffix(file_name,file_name+ct),file(name+suffix);
file=uniFileName(file);
cout<<"extracting compressed file :"<<zipfile_name<<endl;
FILE * f = fopen(file.c_str(),"wb");
char t[numDigit];
fgets(t,numDigit,src);
int sz=atoi(t);
char code[sz];
fread(code,sz,1,src);
int idx=0;
for(int i =0;i<sz;++i ){
if(code[i]==' '){
decode_map[string(code+idx,code+i)]=code[++i];
idx=i+1;
}
}
for(int i=0;i<starNum;++i)cout<<"@";
cout<<endl;
char c;
long cur=charNum,gap=charNum/starNum;
while(cur){
c=fgetc(src);
if(!((--cur)%gap))cout<<"@"<<flush;
for(int i =0;i<8;++i){
if(c&(1<<i))res.append(1,'1');
else res.append(1,'0');
if(decode_map.count(res)!=0){
fputc(decode_map[res],f);
res.clear();
}
}
}
cout<<endl;
c=fgetc(src);
int dgt=fgetc(src);
cout<<feof(f);
if((int)dgt!=-1 ){
for(int i =0;i<dgt;++i){
if(c&(1<<i))res.append(1,'1');
else res.append(1,'0');
if(decode_map.count(res)!=0){
fputc(decode_map[res],f);
res.clear();
break;
}
}
}
fclose(src);
fclose(f);
cout<<"get "<<file <<" successfully"<<endl;
return file;
}
template<typename ky,typename wt>
string huffman<ky,wt>::encode(string file_name,long &charNum)
{
charNum=0;
string uniFileName(string);
int pos =file_name.rfind('.');
if(pos==string::npos)pos=file_name.size();
string zipfile = file_name.substr(0,pos)+string(".zzip");
zipfile = uniFileName(zipfile);
cout<<"generating zip file :"<<zipfile<<endl;
FILE * dst = fopen(zipfile.c_str(),"wb");
FILE * f = fopen(file_name.c_str(),"rb");
fputs(file_name.substr(pos).c_str(),dst);
fputc('\n',dst);
string data;
for(class map<string,ky>::iterator i=decode_map.begin();i!=decode_map.end() ;++i ){
data.append((i->first));
data.append(" ");
data+=(i->second);
}
int data_size = data.size(); // calculate the size of the code_data
char sz[numDigit];
itoa(data_size,sz,numDigit);
int ct=0;
for(;sz[ct];++ct)fputc(sz[ct],dst);
fputc('\n',dst);
fwrite(data.c_str(),data_size,1,dst);
int sum=0,digit=0,num;
string code8;
for(int i=0;i<starNum;++i)cout<<"@";
cout<<endl;
long gap=root.val/starNum,cur=0;
while(!feof(f)){
code8=encode_map[fgetc(f)];
if(!((++cur)%gap))cout<<"@";
for(int i=0;i<code8.size();++i){
if(code8[i]=='1')sum += 1<<(digit); //mistake if(tmp[j])
++digit;
if(digit==8){
++charNum;
fputc(sum,dst);
digit=sum=0;
}
}
}
cout<<endl;
if(digit!=0){ //mark
fputc(sum,dst);
fputc(digit,dst);
}
fclose(f);
fclose(dst);
cout<<"compress "<<file_name <<" successfully"<<endl;
return zipfile;
}
template<typename ky,typename wt>
void huffman<ky,wt>::display()
{
cout<<"the encoding map,huffman codes are as bellow:"<<endl;
for (typename map<ky,string>::iterator i=encode_map.begin();i!=encode_map.end() ;++i )
cout<<i->first<<"("<<(int)i->first<<"):"<<i->second<<endl;
}
bool handle_one(string file_name,vector<long> &origin,vector<long> &compressed)
{
int name_length = file_name.size();
FILE *src=fopen(file_name.c_str(),"rb");
cout<<"opening "<<file_name<<"..."<<endl;
if(!src){
cout<<"Path Error! Opening "<<file_name<<" Failed"<<endl;
origin.push_back(0);
compressed.push_back(0);
return false;
}
char cur;
map<char,long> mp;
while(!feof(src)){
fread(&cur,sizeof(char),1,src);
if(mp.count(cur)){
mp[cur]+=1;
}
else mp[cur]=1;
}
fclose(src);
huffman<char,long> hf(mp);
long sz;
string s(hf.encode(file_name,sz));
origin.push_back(hf.total()),compressed.push_back(sz);
cout<<"\ncontinue to uncompress? [Y/n]"<<endl;
char c=cin.get();
if(c=='n')return true;
hf.decode(s,sz);
return true;
}
bool isSep(char c)
{
return c==' '||c=='\n'||c=='\t'||c==',';
}
void splitToVec(char * s,vector<string>& v)
{
int i=0,last=0;
for(;s[i];++i){
if(isSep(s[i])){
v.push_back(string(s+last,s+i));
while(s[++i]&&isSep(s[i]));
last=i;
}
}
if(s[last])v.push_back(string(s+last,s+i));
}
bool lenStr(string &a,string &b)
{
return a.size()<b.size();
}
void go(vector<string> & names)
{
vector<long> originSize,compressedSize;
vector<int> deltaTime;
double last;
vector<bool> indicator;
bool bl;
for(vector<string>::iterator i=names.begin();i!=names.end();++i){
last=GetTickCount();
bl=handle_one(*i,originSize,compressedSize);
indicator.push_back(bl);
deltaTime.push_back(GetTickCount()-last);
}
cout<<"\ndealt file number "<<originSize.size()<<fixed<<setprecision(2)<<endl;
vector<string>::iterator p=max_element(names.begin(),names.end(),lenStr);
int len = p->size()+2;
for(int i =0;i<names.size();++i){
if(! indicator[i]){continue;}
cout<<names[i]<<string(len-names[i].size(),' ');
cout<<deltaTime[i]<<"ms "<<compressedSize[i]/1024.0<<"KB/"<<originSize[i]/1024.0<<"KB :";
cout<<compressedSize[i]*100.0/originSize[i]<<"%"<<endl;
}
cout<<endl;
system("pause");
system("pause");
}
int main(int argv,char ** argc)
{
_chdir("C:\\Users\\mbinary\\Desktop\\dataStructrue\\huffman");
char cwd[50];
cout<<getcwd(cwd,50)<<endl;
string file1("GitHubDesktopSetup.exe");
string file("³õÐÄδ¸Ä.mp4");
vector<string> names;
if(argv>1){
for(int i=1;i<argv;++i){
names.push_back(argc[i]);
}
go(names);
names.clear();
}
char mk;
while(1){
char s[201];
cout<<"input file names separated by space "<<endl;
cout<<"OR press enter to use the default file:"<<file<<endl;
if(cin.peek()=='\n')names.push_back(file);
else {
cin.getline(s,200);
splitToVec(s,names);
}
cout<<endl;
go(names);
cout<<"continue to compress or uncompress files? [Y/n]:"<<flush;
mk= cin.get();
if(mk=='n')break;
names.clear();
}
return 0;
}

View File

@ -0,0 +1,38 @@
\relax
\@writefile{toc}{\contentsline {section}{\numberline {1}需求分析}{2}}
\@writefile{toc}{\contentsline {paragraph}{1}{2}}
\@writefile{toc}{\contentsline {paragraph}{2}{2}}
\@writefile{toc}{\contentsline {paragraph}{3}{2}}
\@writefile{toc}{\contentsline {paragraph}{4}{2}}
\@writefile{toc}{\contentsline {paragraph}{5}{2}}
\@writefile{toc}{\contentsline {section}{\numberline {2}概要设计}{2}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}结点node}{2}}
\@writefile{toc}{\contentsline {paragraph}{数据对象}{2}}
\@writefile{toc}{\contentsline {paragraph}{数据关系}{2}}
\@writefile{toc}{\contentsline {paragraph}{基本操作}{2}}
\@writefile{toc}{\contentsline {subparagraph}{node()}{2}}
\@writefile{toc}{\contentsline {subparagraph}{node( const node\& nd}{2}}
\@writefile{toc}{\contentsline {subparagraph}{operator<}{2}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}huffman树}{3}}
\@writefile{toc}{\contentsline {paragraph}{数据对象}{3}}
\@writefile{toc}{\contentsline {paragraph}{数据关系}{3}}
\@writefile{toc}{\contentsline {paragraph}{基本操作}{3}}
\@writefile{toc}{\contentsline {subparagraph}{huffman( map)}{3}}
\@writefile{toc}{\contentsline {subparagraph}{encode(string)}{3}}
\@writefile{toc}{\contentsline {subparagraph}{decode(string)}{3}}
\@writefile{toc}{\contentsline {subparagraph}{preorder()}{3}}
\@writefile{toc}{\contentsline {subparagraph}{display}{3}}
\@writefile{toc}{\contentsline {section}{\numberline {3}详细设计}{3}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}编码,解码算法}{3}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}输出进度条}{7}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}改变文件名}{7}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}统计信息}{7}}
\@writefile{toc}{\contentsline {section}{\numberline {4}调试分析}{8}}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}编码信息的存储}{8}}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}最后一个字节}{8}}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}文件名的处理}{8}}
\@writefile{toc}{\contentsline {section}{\numberline {5}用户手册}{8}}
\@writefile{toc}{\contentsline {section}{\numberline {6}测试结果}{9}}
\@writefile{toc}{\contentsline {subsection}{\numberline {6.1}文本文件}{9}}
\@writefile{toc}{\contentsline {subsection}{\numberline {6.2}二进制文件1}{10}}
\@writefile{toc}{\contentsline {subsection}{\numberline {6.3}二进制文件2}{11}}

View File

@ -0,0 +1,363 @@
#include<math.h>
#include<stdio.h>
#include<direct.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<windows.h>
#include<iomanip>
#include<string>
#include<vector>
#include<queue>
#define numDigit 10
#define nameLength 50
#define starNum 80
using namespace std;
void cat(string s)
{
FILE* f=fopen(s.c_str(),"rb");
cout<<"file content"<<endl;
while(!feof(f)){
cout<<fgetc(f);
}
cout<<endl;
}
string uniFileName(string file)
{
FILE * check = fopen(file.c_str(),"rb");
if(check){
char c;
cout<<"the file "<<file<<" already exists! continue? [Y/n]:"<<flush;
c=cin.get();
if(c=='n')exit(0);
int p,q;
p= file.find('(');
q=file.rfind('.');
if(q==string::npos)q=file.size();
if(p==string::npos)p=q;
string name=file.substr(0,p),suffix=file.substr(q,file.size());
int n=0;
while(true){
char s[3];
n+=1;
itoa(n,s,10);
file=(name+"("+s+")"+suffix);
FILE* f=fopen(file.c_str(),"rb");
if(!f)break;
else fclose(f);
}
}
return file;
}
template<class t1, class t2>
void mapprint(map<t1,t2> &f)
{
for(class map<t1,t2>::iterator i = f.begin();i!=f.end();++i)
cout<<i->first<<") : "<<i->second<<endl;
}
template<typename ky,typename wt>
class node
{
public:
ky key;
wt val;
bool visited;
node * left,*right;
node(const node &a){val = a.val;key= a.key;visited = a.visited;left= a.left;right=a.right;}
node(ky k=0,wt v=0):key(k),val(v),visited(false),left(NULL),right(NULL){};
bool operator<(const node<ky,wt> & a)const{return val>a.val;};
};
template<typename ky,typename wt>
class huffman
{
private:
node<ky,wt> root;
string res;
public:
long total(){return root.val;}
map<ky,string> encode_map;
map<string,ky> decode_map;
huffman(map<ky,wt>& mp);
void display();
string encode(string,long &);
string decode(string,long&);
void preOrder(node<ky,wt>*,string);
};
template<typename ky,typename wt>
huffman<ky,wt>::huffman(map<ky,wt>& mp)
{
if(mp.empty()){
cout<<"Error! No data!"<<endl;
root=NULL;
return ;
}
priority_queue<node<ky,wt> > hp;
for(typename map<ky,wt>::iterator i=mp.begin();i!=mp.end();++i){
hp.push( node<ky,wt>(i->first,i->second));
}
int n =hp.size();
if(n==1){
root = hp.top();
return;
}
while(--n>=1){
node<ky,wt> *a = new node<ky,wt>(hp.top());
hp.pop();
node<ky,wt> *b = new node<ky,wt>(hp.top());
hp.pop();
node<ky,wt> * tmp = new node<ky,wt>(0,a->val+b->val);
tmp->left = a,tmp->right = b;
hp.push(*tmp);
}
root = hp.top();
preOrder(&root,string());
}
template<typename ky,typename wt>
void huffman<ky,wt>::preOrder(node<ky, wt>* nd,string s)
{
if(nd->left == NULL){
encode_map[nd->key] =s;
decode_map[s] = nd->key;
delete nd;
return ;
}
preOrder(nd->left,s+'0');
preOrder(nd->right,s+'1');
delete nd;
}
template<typename ky,typename wt>
string huffman<ky,wt>::decode(string zipfile_name,long &charNum)
{
string uniFileName(string);
FILE * src = fopen(zipfile_name.c_str(),"rb");
char file_name[nameLength];
fgets(file_name,nameLength,src);
int ct=-1;
while(file_name[++ct]!='\n');
int pos = zipfile_name.find('.');
if(pos==string::npos)pos=zipfile_name.size();
string name(zipfile_name.substr(0,pos)) ,suffix(file_name,file_name+ct),file(name+suffix);
file=uniFileName(file);
cout<<"extracting compressed file :"<<zipfile_name<<endl;
FILE * f = fopen(file.c_str(),"wb");
char t[numDigit];
fgets(t,numDigit,src);
int sz=atoi(t);
char code[sz];
fread(code,sz,1,src);
int idx=0;
for(int i =0;i<sz;++i ){
if(code[i]==' '){
decode_map[string(code+idx,code+i)]=code[++i];
idx=i+1;
}
}
for(int i=0;i<starNum;++i)cout<<"@";
cout<<endl;
char c;
long cur=charNum,gap=charNum/starNum;
while(cur){
c=fgetc(src);
if(!((--cur)%gap))cout<<"@"<<flush;
for(int i =0;i<8;++i){
if(c&(1<<i))res.append(1,'1');
else res.append(1,'0');
if(decode_map.count(res)!=0){
fputc(decode_map[res],f);
res.clear();
}
}
}
cout<<endl;
c=fgetc(src);
int dgt=fgetc(src);
cout<<feof(f);
if((int)dgt!=-1 ){
for(int i =0;i<dgt;++i){
if(c&(1<<i))res.append(1,'1');
else res.append(1,'0');
if(decode_map.count(res)!=0){
fputc(decode_map[res],f);
res.clear();
break;
}
}
}
fclose(src);
fclose(f);
cout<<"get "<<file <<" successfully"<<endl;
return file;
}
template<typename ky,typename wt>
string huffman<ky,wt>::encode(string file_name,long &charNum)
{
charNum=0;
string uniFileName(string);
int pos =file_name.rfind('.');
if(pos==string::npos)pos=file_name.size();
string zipfile = file_name.substr(0,pos)+string(".zzip");
zipfile = uniFileName(zipfile);
cout<<"generating zip file :"<<zipfile<<endl;
FILE * dst = fopen(zipfile.c_str(),"wb");
FILE * f = fopen(file_name.c_str(),"rb");
fputs(file_name.substr(pos).c_str(),dst);
fputc('\n',dst);
string data;
for(class map<string,ky>::iterator i=decode_map.begin();i!=decode_map.end() ;++i ){
data.append((i->first));
data.append(" ");
data+=(i->second);
}
int data_size = data.size(); // calculate the size of the code_data
char sz[numDigit];
itoa(data_size,sz,numDigit);
int ct=0;
for(;sz[ct];++ct)fputc(sz[ct],dst);
fputc('\n',dst);
fwrite(data.c_str(),data_size,1,dst);
int sum=0,digit=0,num;
string code8;
for(int i=0;i<starNum;++i)cout<<"@";
cout<<endl;
long gap=root.val/starNum,cur=0;
while(!feof(f)){
code8=encode_map[fgetc(f)];
if(!((++cur)%gap))cout<<"@";
for(int i=0;i<code8.size();++i){
if(code8[i]=='1')sum += 1<<(digit); //mistake if(tmp[j])
++digit;
if(digit==8){
++charNum;
fputc(sum,dst);
digit=sum=0;
}
}
}
cout<<endl;
if(digit!=0){ //mark
fputc(sum,dst);
fputc(digit,dst);
}
fclose(f);
fclose(dst);
cout<<"compress "<<file_name <<" successfully"<<endl;
return zipfile;
}
template<typename ky,typename wt>
void huffman<ky,wt>::display()
{
cout<<"the encoding map,huffman codes are as bellow:"<<endl;
for (typename map<ky,string>::iterator i=encode_map.begin();i!=encode_map.end() ;++i )
cout<<i->first<<"("<<(int)i->first<<"):"<<i->second<<endl;
}
bool handle_one(string file_name,vector<long> &origin,vector<long> &compressed)
{
int name_length = file_name.size();
FILE *src=fopen(file_name.c_str(),"rb");
cout<<"opening "<<file_name<<"..."<<endl;
if(!src){
cout<<"Path Error! Opening "<<file_name<<" Failed"<<endl;
origin.push_back(0);
compressed.push_back(0);
return false;
}
char cur;
map<char,long> mp;
while(!feof(src)){
fread(&cur,sizeof(char),1,src);
if(mp.count(cur)){
mp[cur]+=1;
}
else mp[cur]=1;
}
fclose(src);
huffman<char,long> hf(mp);
long sz;
string s(hf.encode(file_name,sz));
origin.push_back(hf.total()),compressed.push_back(sz);
cout<<"\ncontinue to uncompress? [Y/n]"<<endl;
char c=cin.get();
if(c=='n')return true;
hf.decode(s,sz);
return true;
}
bool isSep(char c)
{
return c==' '||c=='\n'||c=='\t'||c==',';
}
void splitToVec(char * s,vector<string>& v)
{
int i=0,last=0;
for(;s[i];++i){
if(isSep(s[i])){
v.push_back(string(s+last,s+i));
while(s[++i]&&isSep(s[i]));
last=i;
}
}
if(s[last])v.push_back(string(s+last,s+i));
}
bool lenStr(string &a,string &b)
{
return a.size()<b.size();
}
void go(vector<string> & names)
{
vector<long> originSize,compressedSize;
vector<int> deltaTime;
double last;
vector<bool> indicator;
bool bl;
for(vector<string>::iterator i=names.begin();i!=names.end();++i){
last=GetTickCount();
bl=handle_one(*i,originSize,compressedSize);
indicator.push_back(bl);
deltaTime.push_back(GetTickCount()-last);
}
cout<<"\ndealt file number "<<originSize.size()<<fixed<<setprecision(2)<<endl;
vector<string>::iterator p=max_element(names.begin(),names.end(),lenStr);
int len = p->size()+2;
for(int i =0;i<names.size();++i){
if(! indicator[i]){continue;}
cout<<names[i]<<string(len-names[i].size(),' ');
cout<<deltaTime[i]<<"ms "<<compressedSize[i]/1024.0<<"KB/"<<originSize[i]/1024.0<<"KB :";
cout<<compressedSize[i]*100.0/originSize[i]<<"%"<<endl;
}
cout<<endl;
system("pause");
system("pause");
}
int main(int argv,char ** argc)
{
char cwd[50];
cout<<getcwd(cwd,50)<<endl;
string file1("GitHubDesktopSetup.exe");
string file("³õÐÄδ¸Ä.mp4");
vector<string> names;
if(argv>1){
for(int i=1;i<argv;++i){
names.push_back(argc[i]);
}
go(names);
names.clear();
}
char mk;
while(1){
char s[201];
cout<<"input file names separated by space "<<endl;
cout<<"OR press enter to use the default file:"<<file<<endl;
if(cin.peek()=='\n')names.push_back(file);
else {
cin.getline(s,200);
splitToVec(s,names);
}
cout<<endl;
go(names);
cout<<"continue to compress or uncompress files? [Y/n]:"<<flush;
mk= cin.get();
if(mk=='n')break;
names.clear();
}
return 0;
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,310 @@
%\document{article}
\documentclass[UTF8]{ctexart}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{fancyhdr}
\usepackage{float}
\usepackage{listings}
\title{Huffman编码压缩}
\author{朱河勤 PB16030899}
\pagestyle{fancy}
\lfoot{朱河勤 PB16030899}
\chead{Huffman编码压缩}
\rfoot{2017/11/11}
\begin{document}
\maketitle
\tableofcontents
\section{需求分析}
\paragraph{1}
正确创建huffman 树并得到huffman编码
\paragraph{2}
压缩编码文件,使一般的文本文件变小,二进制文件可能不会变小
\paragraph{3}
解压文件,注意生成的文件要考虑同名,所以要考虑文件名的操作
\paragraph{4}
压缩解压时显示进度条
\paragraph{5}
解压完毕,统计文件数,压缩率,压缩时间等等
\section{概要设计}
\subsection{结点node}
ADT linkList\{\\
\paragraph{数据对象}key , val, visited ,left,right \\
\paragraph{数据关系}:属性集合\\
\paragraph{基本操作}
\subparagraph{node()} 新建一个结点
\subparagraph{node( const node\& nd} 复制一个结点
\subparagraph{operator<}重载操作符<
\}
\subsection{huffman树}
ADT linkList\{\\
\paragraph{数据对象}root , encode\_map, total\\
\paragraph{数据关系}:属性集合\\
\paragraph{基本操作}
\subparagraph{huffman( map)}传递字符的频率信息以map形式 然后建立huffman树
\subparagraph{encode(string)} 传递文件名,压缩
\subparagraph{decode(string)} 传递文件名,解压缩
\subparagraph{preorder()}先序遍历获得huffman编码
\subparagraph{display}显示所有信息包括结点信息以及huffman编码
\}
\section{详细设计}
\subsection{编码,解码算法}
\begin{lstlisting}[language=c++]
template<typename ky,typename wt>
void huffman<ky,wt>::preOrder(node<ky, wt>* nd,string s)
{
if(nd->left == NULL){
encode_map[nd->key] =s;
decode_map[s] = nd->key;
delete nd;
return ;
}
preOrder(nd->left,s+'0');
preOrder(nd->right,s+'1');
delete nd;
}
template<typename ky,typename wt>
string huffman<ky,wt>::decode(string zipfile_name)
{
string uniFileName(string);
FILE * src = fopen(zipfile_name.c_str(),"rb");
char file_name[nameLength];
fgets(file_name,nameLength,src);
int ct=-1;
while(file_name[++ct]!='\n');
int pos = zipfile_name.find('.');
if(pos==string::npos)pos=zipfile_name.size();
string name(zipfile_name.substr(0,pos)) ,suffix(file_name,file_name+ct),file(name+suffix);
file=uniFileName(file);
cout<<"extracting compressed file :"<<file<<endl;
FILE * f = fopen(file.c_str(),"wb");
if(!f){
cerr<<"Error! Maybe the file doesn't exist!"<<endl;cerr<<"open error!"<<endl;
abort( );
}
char t[numDigit];
fgets(t,numDigit,src);
int sz=atoi(t);
char code[sz];
fread(code,sz,1,src);
cout<<code<<endl;
cout<<"SZ"<<sz<<endl;
// return string();
map<string,char> mp;
int idx=0;
for(int i =0;i<sz;++i ){
if(code[i]==' '){
mp[string(code+idx,code+i)]=code[++i];
idx=i+1;
}
}
mapprint(mp);
char buff[once],*p;
string res;
while(!feof(src)){
p=buff;
int cur=0;
while(cur<once){
ToEightBin(p,fgetc(src));
}
cout<<buff;
return string();
while(buff[++cur]!='\0');
for(int i =0;i<cur;++i){
res.append(1,buff[i]);
if(mp.count(res)!=0){
fputc(mp[res],f);
res.clear();
}
}
}
fclose(src);
fclose(f);
}
template<typename ky,typename wt>
string huffman<ky,wt>::encode(string file_name)
{
string uniFileName(string);
int pos =file_name.rfind('.');
if(pos==string::npos)pos=file_name.size();
string zipfile = file_name.substr(0,pos)+string(".zzip");
zipfile = uniFileName(zipfile);
cout<<"generating zip file :"<<zipfile<<endl;
FILE * dst = fopen(zipfile.c_str(),"wb");
FILE * f = fopen(file_name.c_str(),"rb");
fputs(file_name.substr(pos).c_str(),dst);
fputc('\n',dst);
string data;
for(class map<string,ky>::iterator i=decode_map.begin();i!=decode_map.end() ;++i ){
data.append((i->first));
data.append(" ");
data+=(i->second);
}
cout<<data<<endl<<"SZ"<<data.size()<<endl;;
// mapprint( encode_map);
// return string();
int data_size = data.size(); // calculate the size of the code_data
char sz[numDigit];
itoa(data_size,sz,numDigit);
int ct=0;
for(;sz[ct];++ct)fputc(sz[ct],dst);
fputc('\n',dst);
// cout<<data<<data_size<<endl;
fwrite(data.c_str(),data_size,1,dst);
int sum=0,digit=0,num;
char src[once];
while(!feof(f)){
num = fread(src,sizeof(char),once,f);
string tmp;
for(int i =0;i<num;++i){
tmp=encode_map[src[i]];
for(int j =0;j<tmp.size();++j){
if(tmp[j])sum += 1<<(digit%8);
++digit;
if(digit==8){
fputc(sum,dst);
digit=sum=0;
}
}
}
}
if(digit!=0){ //mark
fputc(sum,dst);
fputc(digit,dst);
}
else fputc(0,dst);
fclose(f);
fclose(dst);
return zipfile;
}
\end{lstlisting}
\subsection{输出进度条}通过输出@以显示当天进度,提示用户
\subsection{改变文件名}由于当前工作目录可能有解压或压缩后的同名文件,要进行处理,我的方法是在后缀前,文件名后加上(n) 其中n为数字
\subsection{统计信息}处理后,统计信息,包括压缩的文件名目录,所用的时间,文件大小,压缩率等等
\section{调试分析}
\subsection{编码信息的存储}
我先计算了编码信息的大小,然后存在文件中,以键值对的形式,如''001 k''再存储编码信息,这样就能更快的读取,并能节省空间
\subsection{最后一个字节}
由于储存时一char八位一次地储存所以最后一字节可能凑不齐我通过补0地方式并在最后再增加一字节记录补0的个数来解决
\subsection{文件名的处理}
文件名要要记录后缀以识别文件种类以及文件是否存在能否打开生成的文件是否重名。比如当发现重名时你要生成n形式但可能(n)也已经存在所以要一直检查12...检查到一个较大的数或者是第一次未出现时才能确定N
\section{用户手册}
本程序需要在windows环境下运行可以直接打开.exe文件或者在命令行支持命令行参数\
下面为程序运行界面
\begin{verbatim}
C:\Users\mbinary\Desktop\dataStructrue\huffman
input file names separated by space
OR press enter to use the default file:初心未改.mp4
opening 初心未改.mp4...
the file 初心未改.zzip already exists! continue? [Y/n]:generating zip file :初心未改(2).zzip
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
compress 初心未改.mp4 successfully
continue to uncompress? [Y/n]
the file 初心未改(2).mp4 already exists! continue? [Y/n]:
extracting compressed file :初心未改(2).zzip
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
get 初心未改(3).mp4 successfully
dealt file number 1
初心未改.mp4 18891ms 8274.84KB/8296.13KB :99.74%
\end{verbatim}
\section{测试结果}
\subsection{文本文件}
输入了几个不存在的文件,检查强壮性。同时发现文本文件压缩率还是很令人满意的
\begin{verbatim}
input file names separated by space
OR press enter to use the default file:初心未改.mp4
em cvem ven em.cc
opening em...
Path Error! Opening em Failed
opening cvem...
Path Error! Opening cvem Failed
opening ven...
Path Error! Opening ven Failed
opening em.cc...
the file em.zzip already exists! continue? [Y/n]:
generating zip file :em(2).zzip
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
compress em.cc successfully
continue to uncompress? [Y/n]
the file em(2).cc already exists! continue? [Y/n]:
extracting compressed file :em(2).zzip
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
get em(3).cc successfully
dealt file number 4
em.cc 2266ms 4.69KB/7.57KB :61.87%
\end{verbatim}
\subsection{二进制文件1}
几乎没有压缩,原因应该是.exe文件本来就压缩得很好了几乎已经是随机的编码了所以huffman没有效果这也是文件不能重复压缩直至没有大小的原因。
\begin{verbatim}
input file names separated by space
OR press enter to use the default file:初心未改.mp4
GitHubDesktopSetup.exe
opening GitHubDesktopSetup.exe...
the file GitHubDesktopSetup.zzip already exists! continue? [Y/n]:
generating zip file :GitHubDesktopSetup(2).zzip
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
compress GitHubDesktopSetup.exe successfully
continue to uncompress? [Y/n]
the file GitHubDesktopSetup(2).exe already exists! continue? [Y/n]:
extracting compressed file :GitHubDesktopSetup(2).zzip
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
get GitHubDesktopSetup(3).exe successfully
dealt file number 1
GitHubDesktopSetup.exe 309610ms 81718.46KB/81718.46KB :100.00%
\end{verbatim}
\subsection{二进制文件2}
\begin{verbatim}
input file names separated by space
OR press enter to use the default file:初心未改.mp4
opening 初心未改.mp4...
the file 初心未改.zzip already exists! continue? [Y/n]:generating zip file :初心未改(3).zzip
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
compress 初心未改.mp4 successfully
continue to uncompress? [Y/n]
the file 初心未改(3).mp4 already exists! continue? [Y/n]:
extracting compressed file :初心未改(3).zzip
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
get 初心未改(4).mp4 successfully
dealt file number 1
初心未改.mp4 13688ms 8274.84KB/8296.13KB :99.74%
\end{verbatim}
\clearpage
\end{document}

View File

@ -0,0 +1,37 @@
\contentsline {section}{\numberline {1}需求分析}{2}
\contentsline {paragraph}{1}{2}
\contentsline {paragraph}{2}{2}
\contentsline {paragraph}{3}{2}
\contentsline {paragraph}{4}{2}
\contentsline {paragraph}{5}{2}
\contentsline {section}{\numberline {2}概要设计}{2}
\contentsline {subsection}{\numberline {2.1}结点node}{2}
\contentsline {paragraph}{数据对象}{2}
\contentsline {paragraph}{数据关系}{2}
\contentsline {paragraph}{基本操作}{2}
\contentsline {subparagraph}{node()}{2}
\contentsline {subparagraph}{node( const node\& nd}{2}
\contentsline {subparagraph}{operator<}{2}
\contentsline {subsection}{\numberline {2.2}huffman树}{3}
\contentsline {paragraph}{数据对象}{3}
\contentsline {paragraph}{数据关系}{3}
\contentsline {paragraph}{基本操作}{3}
\contentsline {subparagraph}{huffman( map)}{3}
\contentsline {subparagraph}{encode(string)}{3}
\contentsline {subparagraph}{decode(string)}{3}
\contentsline {subparagraph}{preorder()}{3}
\contentsline {subparagraph}{display}{3}
\contentsline {section}{\numberline {3}详细设计}{3}
\contentsline {subsection}{\numberline {3.1}编码,解码算法}{3}
\contentsline {subsection}{\numberline {3.2}输出进度条}{7}
\contentsline {subsection}{\numberline {3.3}改变文件名}{7}
\contentsline {subsection}{\numberline {3.4}统计信息}{7}
\contentsline {section}{\numberline {4}调试分析}{8}
\contentsline {subsection}{\numberline {4.1}编码信息的存储}{8}
\contentsline {subsection}{\numberline {4.2}最后一个字节}{8}
\contentsline {subsection}{\numberline {4.3}文件名的处理}{8}
\contentsline {section}{\numberline {5}用户手册}{8}
\contentsline {section}{\numberline {6}测试结果}{9}
\contentsline {subsection}{\numberline {6.1}文本文件}{9}
\contentsline {subsection}{\numberline {6.2}二进制文件1}{10}
\contentsline {subsection}{\numberline {6.3}二进制文件2}{11}

View File

@ -0,0 +1,181 @@
from functools import total_ordering
@total_ordering
class node:
def __init__(self,val,freq=1,s=1,left=None,right=None):
self.val=val
self.freq=freq
self.s=s
if left is None or right is None:
self.left = left if left is not None else right
self.right =None
else:
if left.s<right.s:
left,right =right, left
self.left=left
self.right=right
self.s+=self.right.s
def __eq__(self,nd):
return self.val==nd.val
def __lt__(self,nd):
return self.val<nd.val
def __repr__(self):
return 'node(val=%d,freq=%d,s=%d)'%(self.val,self.freq,self.s)
class leftHeap:
def __init__(self,root=None):
self.root=root
def __bool__(self):
return self.root is not None
@staticmethod
def _merge(root,t): #-> int
if root is None:return t
if t is None:return root
if root<t:
root,t=t,root
root.right = leftHeap._merge(root.right,t)
if root.left is None or root.right is None:
root.s=1
if root.left is None:
root.left,root.right = root.right,None
else:
if root.left.s<root.right.s:
root.left,root.right = root.right,root.left
root.s = root.right.s+1
return root
def insert(self,nd):
if not isinstance(nd,node):nd = node(nd)
if self.root is None:
self.root=nd
return
if self.root==nd:
self.root.freq+=1
return
prt =self. _findPrt(self.root,nd,None)
if prt is None:
self.root=leftHeap._merge(self.root,nd)
else :
if prt.left==nd:
prt.left.freq+=1
else:prt.right.freq+=1
def remove(self,nd):
if not isinstance(nd,node):nd = node(nd)
if self.root==nd:
self.root=leftHeap._merge(self.root.left,self.root.right)
else:
prt = self._findPrt(self.root,nd,None)
if prt is not None:
if prt.left==nd:
prt.left=leftHeap._merge(prt.left.left,prt.left.right)
else:
prt.right=leftHeap._merge(prt.right.left,prt.right.right)
def find(self,nd):
if not isinstance(nd,node):nd = node(nd)
prt = self._findPrt(self.root,nd,self.root)
if prt is None or prt==nd:return prt
elif prt.left==nd:return prt.left
else:return prt.right
def _findPrt(self,root,nd,parent):
if not isinstance(nd,node):nd = node(nd)
if root is None or root<nd:return None
if root==nd:return parent
l=self._findPrt(root.left,nd,root)
return l if l is not None else self._findPrt(root.right,nd,root)
def getTop(self):
return self.root
def pop(self):
nd = self.root
self.remove(self.root.val)
return nd
def levelTraverse(self):
li = [(self.root,0)]
cur=0
while li:
nd,lv = li.pop(0)
if cur<lv:
cur=lv
print()
print(nd,end=' ')
else:print(nd,end=' ')
if nd.left is not None:li.append((nd.left,lv+1))
if nd.right is not None:li.append((nd.right,lv+1))
if __name__ == '__main__':
lh = leftHeap()
data = [(i-3)**2 for i in range(20)]
for i in data:
lh . insert(i)
lh.levelTraverse()
print()
for i in data:
print(lh.getTop())
if lh.find(i) is not None:lh.remove(i)
'''
data = [(i-10)**2 for i in range(20)]
node(100,freq=1,s=3)
node(81,freq=2,s=3) node(64,freq=2,s=2)
node(16,freq=2,s=2) node(25,freq=2,s=2) node(49,freq=2,s=1) node(36,freq=2,s=1)
node(9,freq=2,s=1) node(4,freq=2,s=1) node(1,freq=2,s=1) node(0,freq=1,s=1)
node(100,freq=1,s=3)
node(81,freq=2,s=3)
node(64,freq=2,s=2)
node(49,freq=2,s=1)
node(36,freq=2,s=3)
node(25,freq=2,s=2)
node(16,freq=2,s=2)
node(9,freq=2,s=1)
node(4,freq=2,s=2)
node(1,freq=2,s=1)
node(0,freq=1,s=1)
None
None
None
None
None
None
None
None
None
'''
'''
data = [(i-3)**2 for i in range(20)]
node(256,freq=1,s=1)
node(225,freq=1,s=1)
node(196,freq=1,s=1)
node(169,freq=1,s=1)
node(144,freq=1,s=1)
node(121,freq=1,s=1)
node(100,freq=1,s=1)
node(81,freq=1,s=1)
node(64,freq=1,s=1)
node(49,freq=1,s=1)
node(36,freq=1,s=1)
node(25,freq=1,s=1)
node(16,freq=1,s=1)
node(9,freq=2,s=2)
node(4,freq=2,s=1) node(1,freq=2,s=1)
node(0,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
node(256,freq=1,s=1)
'''

View File

@ -0,0 +1,103 @@
class loserTree:
'''if i<=lowExt p = (i+offset)//2
else p = (i+n-1-lowExt)//2
s is the num of the full subtree node
p is the index of tree
i is the index of players
offset is a num 2^k-1 just bigger than n
lowExt is the double node num of the lowest layer of the tree
'''
def __init__(self,players,reverse=False):
self.n=len(players)
self.tree = [0]*self.n
players.insert(0,0)
self.players=players
self.reverse=reverse
self.getNum()
self.tree[0] = self.initTree(1)
self.dir=None
def getNum(self):
i=1
while 2*i< self.n:i=i*2
if 2*i ==self. n:
self.lowExt=0
self.s = 2*i-1
else:
self.lowExt = (self.n-i)*2
self.s = i-1
self.offset = 2*i-1
def treeToArray(self,p):
return 2*p-self.offset if p>self.s else 2*p+self.lowExt-self.n+1
def arrayToTree(self,i):
return (i+self.offset)//2 if i<=self.lowExt else (i-self.lowExt+ self.n-1)//2
def win(self,a,b):
return a<b if self.reverse else a>b
def initTree(self,p):
if p>=self.n:
delta = p%2 #!!! good job notice delta mark the lchild or rchlid
return self.players[self.treeToArray(p//2)+delta]
l = self.initTree(2*p)
r = self.initTree(2*p+1)
if self.win(r,l):
self.tree[p] = l
self.dir = 'r'
return r
else :
self.tree[p] = r
self.dir = 'l'
return l
def getWinIdx(self,idx=1):
while 2*idx<self.n:
idx = 2*idx if self.tree[idx].dir == 'l' else idx*2+1
return self.treeToArray(idx)
def winner(self):
i = self.getWinIdx()
i = i+1 if self.players[i] !=self.tree[0] else i
return self.tree[0],i
def getOppo(self,i,x,p):
oppo=None
if 2*p<self.n:oppo=self.tree[2*p]
elif i<=self.lowExt:oppo=self.players[i-1+i%2*2]
else:
lpl= self.players[2*p+self.lowExt-self.n+1]
oppo = lpl if lpl!=x else self.players[2*p+self.lowExt-self.n+2]
return oppo
def update(self,i,x):
''' i is 1-indexed which is the num of player
and x is the new val of the player '''
self.players[i]=x
p = self.arrayToTree(i)
oppo =self.getOppo(i,x,p)
self.tree[p],winner = x , oppo if self.win(oppo,x) else oppo,x
p=p//2
while p:
l = self.tree[p*2]
r = None
if 2*p+1<self.n:r=self.tree[p*2+1] #notice this !!!
else:r = self.players[2*p+self.lowExt-self.n+1]
self.tree[p] = l if self.win(l,r) else r
p=p//2
# to do update-func the change of every node's dir and loser
if __name__ =='__main__':
s= [4,1,6,7,9,5234,0,2,7,4,123]
t = winnerTree(s)
for i in s:
val,idx=t.winner()
print(val,idx)
t.update(idx,-1)
'''
[0, 4, 1, 6, 7, 9, 5234, 0, 2, 123] [0, 5234, 9, 5234, 6, 9, 5234, 123, 4]
5234 6
123 9
9 5
7 4
6 3
4 1
2 8
1 2
0 7
-1 1
'''

View File

@ -0,0 +1,138 @@
#include<stdio.h>
bool isZero(float a)
{
return a<0.00001&&-a<0.00001;
}
template<class,class> class map;
//notice that if you declare a class template,declare the class first like this.
template<class t1,class t2>
class pair
{
friend class map<t1,t2>;
pair<t1,t2> *next;
public:
t1 first;
t2 second;
};
template<class t1,class t2>
class map
{
int n;
pair<t1,t2> head;
int cur;
pair<t1,t2> *last_visit;
public:
map();
~map();
bool has(t1);
void erase(t1);
t2& operator[](t1);
pair<t1,t2> &locate(int index = -1);
int size();
};
template<class t1,class t2>
map<t1,t2>::map(){
n=0;
cur=-1;
last_visit= &head;
head.next=NULL;
head.first = head.second = 0;
}
template<class t1,class t2>
map<t1,t2>::~map()
{
pair<t1,t2> *p,*q=&head;
while(q!=NULL){
p=q->next;
delete q;
q=p;
}
}
template<class t1,class t2>
bool map<t1,t2>::has(t1 key)
{
pair<t1,t2> *p = head.next;
for(int i = 0;i<n&&p->first<=key;++i){
if(isZero(p->first-key)) return 1;
p=p->next;
}
return 0;
}
template<class t1,class t2>
pair<t1,t2>& map<t1,t2>::locate(int index)
{
if(index>=n||index<0){
printf("the index is out of range\n");
return head;
}
if(cur>index){
last_visit = &head;
cur = -1;
}
while(cur<index){
last_visit = last_visit->next;
++cur;
}
return *last_visit;
}
template<class t1,class t2>
int map<t1,t2>::size()
{
return n;
}
template<class t1,class t2>
t2& map<t1,t2>::operator[](t1 key)
{
pair<t1,t2> * p=&head;
while(p->next!=NULL){
if(isZero(p->next->first-key)) return p->next->second;
else if(p->next->first>key){break;}
p=p->next;
}
cur=-1;
last_visit= &head;
pair<t1,t2> *tmp = new pair<t1,t2>;
tmp ->next = p->next;
tmp->first = key;
p->next = tmp;
++n;
return tmp->second;
}
template<class t1,class t2>
void map<t1,t2>::erase(t1 key)
{
pair<t1,t2> *p = &head;
while(p->next!=NULL){
if(isZero(p->next->first-key)){
pair<t1,t2> *q = p->next;
p->next = p->next->next;
delete q;
--n;
break;
}
p=p->next;
}
cur=-1;
last_visit= &head;
}
int main()
{
map<double,float> b;
for(int i = 0;i<40;++i){
b[i] = i;
if(i%3){
b[i] = 1;
}
if(i%2){
b.erase(i);
}
}
for(int i = 0;i<b.size();++i){
printf("item %d %g:%g\n",i,b.locate(i).first,b.locate(i).second);
}
return 0;
}

Binary file not shown.

View File

@ -0,0 +1,143 @@
from collections import deque
class vertex:
def __init__(self,mark,val=None ,firstEdge = None):
self.mark = mark
self.val = val
self.firstEdge = firstEdge
self.isVisited = False
def __str__(self):
try:
int(self.mark)
return 'v'+str(self.mark)
except:return str(self.mark)
def __repr__(self):
li=[]
arc= self.firstEdge
while arc!=None:
li.append(arc)
arc= arc.outNextEdge
return str(self)+ ' to:'+str([str(i.inArrow) for i in li])
class edge:
def __init__(self,outArrow,inArrow,outNextEdge = None,inNextEdge = None, weight = 1):
self.weight = weight
self.inNextEdge = inNextEdge
self.outNextEdge = outNextEdge
self.outArrow = outArrow
self.inArrow=inArrow
self.isVisited = False
def __str__(self):
return '--'+str(self.weight)+'-->'
def __repr__(self):
return str(self)
class graph:
def __init__(self):
self.vertexs = {}
self.edges = {}
def __getitem__(self,i):
return self.vertexs[i]
def __setitem__(selfi,x):
self.vertexs[i]= x
def __iter__(self):
return iter(self.vertexs.values())
def __bool__(self):
return len(self.vertexs)!=0
def addVertex(self,i):
if not (i,vertex) and i not in self.vertexs:self.vertexs[i]= vertex(i)
if isinstance(i,vertex) and i not in self.vertexs:self.vertexs[i.mark]= i
def isConnected(self,v,u):
v = self.__getVertex(v)
u = self.__getVertex(u)
arc= v.firstEdge
while arc!=None:
if arc.inArrow==u:return True
arc = arc.inNextEdge
return False
def __getVertex(self,v):
if not isinstance(v,vertex):
if v not in self.vertexs:
self.vertexs[v]=vertex(v)
return self.vertexs[v]
return v
def addEdge(self,v,u,weight = 1):
v = self.__getVertex(v)
u = self.__getVertex(u)
arc = v.firstEdge
while arc!=None: #examine that if v,u have been already connected
if arc.inArrow==u: return
arc= arc.outNextEdge
newEdge = edge(v,u,v.firstEdge,u.firstEdge,weight)
self.edges[(v.mark,u.mark)] = newEdge
v.firstEdge = newEdge
def delEdge(self,v,u):
if not isinstance(v,vertex):v= self.vertexs[v]
if not isinstance(u,vertex):u= self.vertexs[u]
self._unrelated(v,u)
del self.edges[(v.mark,u.mark)]
def _unrelated(self,v,u):
if v.firstEdge==None:return
if v.firstEdge.inArrow == u:
v.firstEdge =v.firstEdge.outNextEdge
else:
arc = v.firstEdge
while arc.outNextEdge!=None:
if arc.outNextEdge.inArrow ==u:
arc.outNextEdge = arc.outNextEdge.outNextEdge
break
def reVisit(self):
for i in self.vertexs:
self.vertexs[i].isVisited=False
for i in self.edges:
self.edges[i].isVisited=False
def __str__(self):
arcs= list(self.edges.keys())
arcs=[str(i[0])+'--->'+str(i[1])+' weight:'+str(self.edges[i].weight) for i in arcs]
s= '\n'.join(arcs)
return s
def __repr__(self):
return str(self)
def notIn(self,v):
if (isinstance(v,vertex) and v.mark not in self.vertexs) or v not in self.vertexs:
return True
return False
def minPath(self,v,u):
'''dijstra'''
self.reVisit()
if self.notIn(v) or self.notIn(u):
return [],0
v = self.__getVertex(v)
u = self.__getVertex(u)
if v.firstEdge==None:return [],0
q=deque([v])
last = {i : None for i in self}
distance={i : 1<<30 for i in self}
distance[v]=0
while len(q)!=0:
cur= q.popleft()
cur.isVisited = True
arc = cur.firstEdge
while arc!=None:
to = arc.inArrow
if not to.isVisited:
q.append(to)
if distance [to] > distance[cur]+arc.weight:
last[to]=cur
distance[to] =distance[cur]+arc.weight
arc= arc.outNextEdge
cur = u
path=[]
while cur!=None and cur!=v:
path.append(cur.mark)
cur=last[cur]
if cur==None:return [], 0
path.append(v.mark)
return path[::-1],distance[u]
def hasVertex(self,mark):
return mark in self.vertexs
def display(self):
print('vertexs')
for i in self.vertexs:
print(self.vertexs[i].__repr__())
print('edges')
for i in self.edges:
arc=self.edges[i]
print(str(arc.outArrow)+str(arc)+str(arc.inArrow))

View File

@ -0,0 +1,225 @@
from collections import deque
import directed
class vertex:
def __init__(self,mark,val=None):
self.mark = mark
self.val = val
self.edges = {}
self.isVisited = False
def __getitem__(self,adjVertexMark):
return self.edges[adjVertexMark]
def __delitem__(self,k):
del self.edges[k]
def __iter__(self):
return iter(self.edges.values())
def __str__(self):
try:
int(self.mark)
return 'v'+str(self.mark)
except:return str(self.mark)
def __repr__(self):
return str(self)
class edge:
def __init__(self,adjVertexs, weight = 1):
'''adjVertexs:tuple(v.mark,u.mark)'''
self.weight = weight
self.adjVertexs = adjVertexs
self.isVisted = False
def __add__(self,x):
return self.weight +x
def __radd__(self,x):
return self+x
def __getitem__(self,k):
if k!=0 or k!=1:raise IndexError
return self.adjVertexs[k]
def __str__(self):
return '--'+str(self.weight)+'--'
def __repr__(self):
return str(self)
@property
def v(self):
return self.adjVertexs[0]
@property
def u(self):
return self.adjVertexs[1]
class graph:
def __init__(self):
self.vertexs = {}
self.edges = {}
def __getitem__(self,i):
return self.vertexs[i]
def __setitem__(selfi,x):
self.vertexs[i]= x
def __iter__(self):
return iter(self.vertexs)
def __bool__(self):
return len(self.vertexs)!=0
def addVertex(self,v):
if not isinstance(v,vertex) and v not in self.vertexs:self.vertexs[v]= vertex(v)
if isinstance(v,vertex) and v not in self.vertexs:self.vertexs[v.mark]= v
def __getVertex(self,v):
if not isinstance(v,vertex):
if v not in self.vertexs:
self.vertexs[v]=vertex(v)
return self.vertexs[v]
return v
def addEdge(self,v,u,weight = 1):
v = self.__getVertex(v)
u = self.__getVertex(u)
for arc in v:
if u in arc.adjVertexs:return #examine that if v,u have been already connected
vertexs = (v,u)
newEdge = edge (vertexs,weight)
self.edges[vertexs] = newEdge
v.edges[u] = newEdge
u.edges[v] = newEdge
def delEdge(self,v,u):
if not isinstance(v,vertex):v= self.vertexs[v]
if not isinstance(u,vertex):u= self.vertexs[u]
try:
del v[u]
del u[v]
except:print("error!"+str(v)+','+str(u)+' arent adjacent now')
del self.edges[(v,u)]
def reVisit(self):
for i in self.vertexs.values():
i.isVisited = False
for i in self.edges.values():
i.isVisited = False
def __str__(self):
arcs= list(self.edges.keys())
arcs=[str(i[0])+str(self.edges[i])+str(i[1]) for i in arcs]
s= '\n'.join(arcs)
return s
def __repr__(self):
return str(self)
def minPath(self,v,u):
self.reVisit()
v=self.__getVertex(v)
u=self.__getVertex(u)
q=deque([v])
last={i:None for i in self.vertexs.values()}
last[v] = 0
ds={i:1<<30 for i in self.vertexs.values()}
ds[v]=0
while len(q)!=0:
nd = q.popleft()
nd.isVisited=True
for edge in nd:
tgt=None
if edge.v==nd:
tgt = edge.u
else:tgt = edge.v
tmp=ds[nd]+edge
if ds[tgt] >tmp:
ds[tgt]=tmp
last[tgt] = nd
if not tgt.isVisited:q.append(tgt)
path=[]
cur = u
while cur !=None and cur.mark!=v.mark:
path.append(cur.mark)
cur = last[cur]
if cur==None:return [],-1
path.append(v.mark)
return path[::-1],ds[u]
def hasCircle(self):
pass
def display(self):
print('vertexs')
for i in self.vertexs:
print(i,end=' ')
print('')
print('edges')
for i in self.edges:
arc=self.edges[i]
print(str(arc.v)+str(arc)+str(arc.u))
def loop(dic):
while True:
print('input vertexs to get the min distance, input \'exit\' to exit')
s=input().strip()
if s=='exit':break
s=s.split(' ')
s=[dic[i] if '0'<=i[0]<='9' else i for i in s]
a,b,c=s[0],s[1],None
path,d = g.minPath(a,b)
path2=None
if len(s)==3:
c=s[2]
path2,d2=g.minPath(b,c)
d+=d2
if path==[] or path2==[] :
if len(s)==3: print(a+' can\'t reach '+c+' via '+b)
else: print(a+' can\'t reach '+b)
continue
if path2!=None:path+=path2[1:]
print('distance : ',d)
print('path','-->'.join(path))
if __name__ =='__main__':
s=input('1. undireted\n2. directed\n')
flag=input('name vertex by 1. num(1-index) or 2. string? ').strip()
dic={}
g = graph()
if s=='2': g=directed.graph()
v,e=input('input vertex num & edge num: ').strip().split(' ')
v,e=int(v),int(e)
if flag=='1':
for i in range(v):
tmp=str(i+1)
dic[tmp]=tmp
g.addVertex(tmp)
else:
print('input vertex name line by line')
for i in range(v):
dic[str(i+1)]=input().strip()
g.addVertex(dic[str(i+1)])
print('input edge info line by line')
for i in range(e):
li=input().strip().split(' ')
a,b,w=li[0],li[1],1
if len(li)==3:w=int(li[2])
a,b=dic[a],dic[b]
g.addEdge(a,b,w)
print('you\'ve build graph :')
g.display()
loop(dic)
'''
6 6
1 2 5
1 3 1
2 6 1
2 5 1
4 5 2
3 4 1
1 5
'''
'''
6 10
NewYork
LA
BeiJing
HeFei
SiChuan
Paris
2 1
5 3
6 1
3 1
4 4
1 3
2 1
5 1
2 4
3 4
SiChuan NewYork
Paris HeFei
V4<---V3<---V2<---V1
3
V4<---V3<---V2
2
'''

View File

@ -0,0 +1,327 @@
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<malloc.h>
#include<map>
using namespace std;
bool isZero(double a)
{
if((a<0.00001)&&-a<0.00001)
return true;
return false;
}
class node
{
friend class polynomial;
double coefficient;
double index;
};
class polynomial
{
int SIZE;
int n;
node* p;
public:
polynomial(int sz=50);
polynomial(const polynomial & );
~polynomial();
double cal(double);
void getData();
void display();
polynomial operator=(const polynomial &);
polynomial operator+(const polynomial &);
polynomial operator-(const polynomial &);
polynomial operator*(const polynomial &);
};
polynomial::polynomial(int sz):n(0),SIZE(sz)
{
p = (node*) new node[SIZE];
memset(p,0,sizeof(p));
}
polynomial::~polynomial()
{
delete p;
}
double polynomial::cal(double x)
{
double rst=0;
for(int i =0;i<n;++i){
rst += pow(x,p[i].index)*p[i].coefficient;
}
return rst;
}
polynomial::polynomial(const polynomial &a)
{
p = (node*) new node[50];
memset(p,0,sizeof(p));
n = a.n;
for(int i = 0;i<a.n;++i){
p[i].index = a.p[i].index;
p[i].coefficient = a.p[i].coefficient;
}
}
polynomial polynomial::operator=(const polynomial& a)
{
n = a.n;
for(int i = 0;i<a.n;++i){
p[i].index = a.p[i].index;
p[i].coefficient = a.p[i].coefficient;
}
return *this;
}
void polynomial::display()
{
node * tmp = p;
if(n == 0){
printf("0\n");
return;
}
// char *fmt = ("x"); printf(fmt,...);
for(int i = n-1;i>=0;--i){
double t = tmp[i].coefficient;
double idx = tmp[i].index;
if(isZero(idx)){
printf("%+g",t);
continue;
}
if(isZero(t-1)) printf("+");
else if(isZero(t+1))printf("-");
else printf("%+g",t);
printf("x");
if(!isZero(idx-1)) printf("^%g",idx);
}
printf("\n");
}
void polynomial::getData()
{
printf("Please input data . \n");
printf("For every item,Coefficient first .Use space to separate,EOF to end\n");
map<double,double> mp;
double idx;
double coef;
while(scanf("%lf%lf",&coef,&idx)!=EOF){
if(isZero(coef)) continue;
if(mp.count(idx) == 0){
mp[idx] = coef;
}
else{
mp[idx] += coef;
if(isZero(mp[idx])){
mp.erase(idx);
}
}
}
if(mp.size()>SIZE){
SIZE *=2;
p = (node*)realloc(p,sizeof(node)*SIZE) ;
}
for(map<double,double>::iterator it = mp.begin();it!=mp.end();++it){
p[n].index = it->first;
p[n++].coefficient = it->second;
}
}
polynomial polynomial::operator+(const polynomial & a)
{
polynomial rst ;
int p1 = 0,p2 = 0,p3 = 0;
double exp1 = p[p1].index;
double exp2 = a.p[p2].index;
while(p1<n && p2<a.n){
while(p1<n &&exp1<exp2){
rst.p[p3].index = exp1;
rst.p[p3].coefficient = p[p1].coefficient;
++p1,++p3;
exp1 = p[p1].index;;
}
while(p2<a.n &&exp1>exp2){
rst.p[p3].index = exp2;
rst.p[p3].coefficient = a.p[p2].coefficient;
++p2,++p3;
exp2 = a.p[p2].index;;
}
if(isZero(exp1-exp2)){
double tmp= p[p1].coefficient + a.p[p2].coefficient;
if(isZero(tmp)){
++p1,++p2;
}
else{
rst.p[p3].index = p[p1].index;
rst.p[p3].coefficient = tmp;
++p1,++p2,++p3;
}
}
}
if(p1 == n){
while(p2<a.n){
rst.p[p3].index = a.p[p2].index;
rst.p[p3].coefficient = a.p[p2].coefficient;
++p2,++p3;
}
}
else{
while(p1<n){
rst.p[p3].index = p[p1].index;
rst.p[p3].coefficient = p[p1].coefficient;
++p1,++p3;
}
}
rst.n = p3;
return rst;
}
polynomial polynomial::operator-(const polynomial & a)
{
polynomial rst(a) ;
int i = 0;
while(i<rst.n){
rst.p[i].coefficient = -rst.p[i].coefficient;
++i;
}
return (*this + rst);
}
polynomial polynomial::operator*(const polynomial & a)
{
map<double,double> mp;
for(int i = 0;i<n;++i){
double idx = p[i].index;
double coef = p[i].coefficient;
for(int j = 0;j<a.n;++j){
double index = idx+a.p[j].index;
if(mp.count(index)==0){
mp[index] = coef*a.p[j].coefficient;
}
else{
mp[index] += coef*a.p[j].coefficient;
if(isZero(mp[index])){
mp.erase(index);
}
}
}
}
int sz =50;
while(mp.size()>sz){
sz *=2;
}
polynomial rst(sz);
for(map<double,double>::iterator it = mp.begin();it!=mp.end();++it){
rst.p[rst.n].index = it->first;
rst.p[rst.n++].coefficient = it->second;
}
return rst;
}
int num = 0;
polynomial pl[30];
void menu()
{
printf("**********OPERATIONS***********\n");
printf("*****0. create *****\n");
printf("*****1. add + *****\n");
printf("*****2. sub - *****\n");
printf("*****3. mul * *****\n");
printf("*****4. display *****\n");
printf("*****5. menu *****\n");
printf("*****6. clear screen *****\n");
printf("*****7. exit *****\n");
printf("*****8. copy *****\n");
printf("*****9. display all *****\n");
printf("*****10. cal val *****\n");
printf("**********OPERATIONS***********\n");
}
void loop()
{
int op;
while(scanf("%d",&op)!=EOF){
if(op == 0){
pl[num].getData();
++num;
printf("You've created polynomial %d:\n",num);
pl[num-1].display();
}
else if(op==1||op==2||op==3){
if(num<2){
printf("Oops! you've got less two polynomial\nPlease choose another operation\n");
continue;
}
printf("input two nums of the two polynomial to be operated.eg: 1 2\n");
int t1=100,t2=100;
while(1){
scanf("%d%d",&t1,&t2);
if(t1>num||t2>num||t1<0||t2<0){
printf("wrong num ,please input again\n");
}
else break;
}
printf("the rst is:\n");
t1 -=1,t2-=1;
if(op == 1){
(pl[t1]+pl[t2]).display();
}
else if(op == 2){
(pl[t1]-pl[t2]).display();
}
else (pl[t1]*pl[t2]).display();
}
else if(op == 4){
printf("input a polynomial's num to display it\n");
int tmp;
scanf("%d",&tmp);
if(tmp>num){
printf("wrong num");
}
else{
printf("info of polynomial %d\n",tmp);
pl[tmp-1].display();
}
}
else if(op == 9){
for(int i = 0;i<num;++i){
printf("polynomial %d : ",i+1);
pl[i].display();
}
}
else if(op == 5){
menu();
}
else if(op == 6){
system("cls");
menu();
}
else if(op == 10){
double x;
int t;
printf("choose a polynomial\n");
scanf("%d",&t);
if(t>num||t<0){
printf("wrong num\n");
}
else {
printf("input a value\n");
scanf("%lf",&x);
pl[t-1].display();
printf("%g\n",pl[t-1].cal(x));
}
}
else if(op == 8){
if(num == 0){
printf("you have'nt any polynomial tp copy\n");
continue;
}
int n = num+1;
while(n>num){
printf("input the number of an existing polynomial you want to copy\n");
scanf("%d",&n);
}
(pl[num] = pl[n-1]);
printf("You've copyed this polynomial:\n");
pl[num++].display();
}
else exit(0);
printf("select an operation\n");
}
}
int main(void)
{
menu();
loop();
return 0;
}

Binary file not shown.

View File

@ -0,0 +1,161 @@
#!/bin/python3
# notice that creating a class's initialization won't conflict with __call__ method
# because the former call class ,and the latter call instance
# to be implemented
class polynomial:
pls= []
n = 0
def dictize(pl):
if isinstance(pl,int) or isinstance(pl,float):
pl = {0:pl}
if isinstance(pl,polynomial):
pl = pl.polynomial.copy()
return pl
def isZero(n):
return abs(n)<0.000001
def __init__(self,s='0 0'):
polynomial.pls.append(self)
polynomial.n +=1
if isinstance(s,polynomial):
self.polynomial=s.polynomial.copy()
# don't write like this .**self.polynomial = s.polynomial**,it's ref
return
elif isinstance(s,dict):
self.polynomial = s.copy()
return
s= s.replace(',',' ')
s= s.replace('x',' ')
s= s.replace('x^',' ')
s = s.replace(':',' ')
s = s.replace('\n',' ')
s = s.split(' ')
num = len(s)
i = 0
print(s)
self.polynomial = dict()
li = [float(i) for i in s]
while i<num:
if not polynomial.isZero(li[i]):
index = li[i+1]
if index in self.polynomial.keys():
self.polynomial[index] += li[i]
else:self.polynomial[index] = li[i]
i+=2
if not self.polynomial:
self.polynomial = {0:0}
def __iter__(self):
return iter(list(self.polynomial.keys()))
def __getitem__(self,key):
return self.polynomial[key]
def __setitem__(self,key,val):
self.polynomial[key] = val
def __delitem__(self,k):
del self.polynomial[k]
def __add__(self,pl):
pl = polynomial.dictize(pl)
rst = self.polynomial.copy()
for i in pl:
if i not in rst:
rst[i] = pl[i]
else:
rst[i] += pl[i]
if polynomial.isZero(rst[i]):
del rst[i]
return polynomial(rst)
def __iadd__(self,pl):
pl = polynomial.dictize(pl)
for i in pl:
if i not in self:
self[i] = pl[i]
else:
self[i] += pl[i]
if polynomial.isZero(self[i]):
del self[i]
return self
def __sub__(self,pl):
pl = polynomial.dictize(pl)
tmp = {i:-j for i,j in pl.items()}
return self + tmp
def __mul__(self,pl):
pl = polynomial.dictize(pl)
dic = dict()
for i in pl:
for j in self:
index= i+j
if index in dic:
dic[index] += pl[i]*self[j]
else:dic[index] = pl[i]*self[j]
return polynomial({i:j for i,j in dic.items() if not polynomial.isZero(j)})
def __imul__(self,pl):
self = self*pl
return self
def __pow__(self,n):
rst = polynomial({0:1})
for i in range(n):
rst*=self.polynomial
return rst
def __repr__(self):
return self.__str__()
def __str__(self):
output = ''
if self.polynomial:
key = sorted(self.polynomial.keys(),reverse = True)
num = len(key)
for j,i in enumerate(key):
if polynomial.isZero(i):
output +='%+g'%self[i]
continue
if not polynomial.isZero(self[i]-1):
if not polynomial.isZero(self[i]+1):
output +="%+g"%self[i]
else:output +='-'
else:output +='+'
if not polynomial.isZero(i): output +='x'
if not polynomial.isZero(i-1):output +='^%g'%i
if output[0] == '+':
return output[1:]
return output
def iterPolynomial(self,s):
rst = polynomial({0:0})
for i in self:
rst += s**int(i)*self[i]
return rst
def __call__(self,s):
if isinstance(s,polynomial):
return self.iterPolynomial(s)
sum = 0
for i in self:
sum += self[i] * s**i
return sum
def __xor__(self,n):
tmp = polynomial(self)
for i in range(n):
self = self.iterPolynomial(tmp)
return self
def save(self):
polynomial.pls.append(self)
polynomial.n +=1
def delPlynomial(self,n):
return polynomial.pls.pop(n-1)
def menu():
print('polynomial operations')
print('1.create')
print('2.add')
print('3.sub')
print('4.iadd')
print('5.mul')
print('6.del')
print('7.display')
print('8.cal val')
print('9.polynomial iter')
print('10.menu')
print('11.exit')
def go():
menu()
if __name__ == '__main__':
go()

View File

@ -0,0 +1,11 @@
def get(n)
li = [i for i in range(2,n)]
i = 1
while i <len(li):
prod =2 * li[i]
while prod <=li[-1]:
if prod in li:
li.remove(prod)
prod+=li[i]
i+=1
return li

View File

@ -0,0 +1,43 @@
#include<stdio.h>
template<class type>
bool operator <(type x,type y){return x<y;}
template<class type>
class segTree
{
int size;
type *p;
public:
segTree(int n=1);
~segTree();
void update(int i,type x);
type getMin(int a,int b){return find(a,b,1,size,1);}
type find(int a,int b,int i,int j,int);
};
template<class type >
segTree<type>::segTree(int n):size(1)
{
while(size<n)size*=2;
p = new type[2*size-1];
for (int i=0;i<2*size-1 ;++i )p[i]=MAX;
}
template<class type >
segTree<type>::~segTree(){delete p;}
template<class type>
void segTree<type>::update(int i,type x)
{
i+=size-1;
p[i]=x;
while(i!=0){
i/=2;
p[i]=p[i*2]<p[i*2+1]?p[i*2]:p[i*2+1];
}
}
template<class type>
type segTree<type>::find(int a,int b,int i , int j,int k)
{
if(b<i}}j<a)return MAX;// to implement
if (a<=i&&j<=b)return p[k];
type l= find(a,b,i,(i+j)/2,2*k);
type r= find(a,b,(i+j)/2+1,j,2*k+1);
return l>r ?l:r;
}

View File

@ -0,0 +1,160 @@
from collections import deque,Iterable
# use isinstance(obj,Iterable) to judge if an obj is iterable
class node:
def __init__(self,val = None,left=None,right=None,parent=None):
self.val = val
if val :self.freq = 1
else :self.freq = 0
self.left = left
self.right = right
self.parent = parent
def getChild(self,s=0):
if isinstance(s,int):s =[s]
last = self
for i in s:
if not last:return None
if i == 0: last = last.left
else:last = last.right
return last
def setChild(self,child,s=0):
if isinstance(s,Iterable):
i = s[0]
del s[0]
if i == 0:self.left.setChild(child,s)
else:self.right.setChild(child,s)
elif s:self.right = child
else:self.left = child
class splayTree:
def __init__(self,s=[]):
s = list(s)
self.root = None
s = sorted(s,reverse = True)
for i in s:
self.insert(self.root,i)
def insert(self,k):
if not self.root :self.root = node(k)
else:self._insert(self.root,k)
def _insert(self,root,k):
if root.val == k :
root.freq +=1
elif root.val<k:
if not root.right:
root.right = node(k)
root.right.parent = root
else:self._insert(root.right,k)
else:
if not root.left:
root.left = node(k)
root.left.parent = root
else:self._insert(root.left,k)
def _zigzagRotate(self,i,j,root,parent,grand):
parent.setChild(root.getChild(i),j)
root.setChild(parent,i)
grand.setChild(root.getChild(j),i)
root.setChild(grand,j)
if root.parent:root.parent = grand.parent
parent.parent = root
grand.parent = root
def _lineRotate(self,i,root,parent,grand):
grand.setChild(parent.getChild(i^1),i)
parent.setChild(grand,i^1)
parent.setChild(root.getChild(i^1),i)
root.setChild(parent,i^1)
if root.parent:root.parent = grand.parent
parent.parent = root
grand.parent = parent
def _rotate(self,root):
if root == self.root:return
if root.parent == self.root:
for i in range(2):
if root.parent.getChild(i) == root:
root.parent.parent = root
root.parent.setChild(root.getChild(i^1),i)
root.parent = None
root.setChild(self.root,i^1)
self.root = root
else:
grand = root.parent.parent
parent = root.parent
if grand == self.root:
self.root = root
root.parent = None
else:
for i in range(2):
if grand.parent.getChild(i) == grand:
grand.parent.setChild(root,i)
for i in range(2):
for j in range(2):
if i!=j and grand.getChild([i,j]) == root:
self._zigzagRotate(i,j,root,parent,grand)
elif i==j and grand.getChild([i,i]) == root:
self._lineRotate(i,root,parent,grand)
self._rotate(root)
def _find(self,root,k):
if not root:return 0
if root.val > k:
return self._find(root.left,k)
elif root.val<k:
return self._find(root.right,k)
else:
self._rotate(root)
return root.freq
def _maxmin(self,root,i=0):
if not root:return None
if root.getChild(i):
return self._maxmin(root.getChild(i))
return root
def Max(self):
return self._maxmin(self.root,1)
def Min(self):
return self._maxmin(self.root,0)
def remove(self,k):
tmp = self.find(k)
if not tmp:raise ValueError
else:
if self.root.left:
r = self.root.right
self.root = self.root.left
self.root.parent = None
Max = self.Max()
Max.right= r
if r:
r.parent = Max
else:
self.root = self.root.right
def find(self,k):
return self._find(self.root,k)
def levelTraverse(self):
q = deque()
q.append((self.root,0))
rst = []
while q:
tmp,n= q.popleft()
rst.append(tmp)
if tmp.left:q.append((tmp.left,n+1))
if tmp.right:q.append((tmp.right,n+1))
return rst
def display(self):
data = self.levelTraverse()
for i in data:
print (i.val,end=' ')
print('')
if __name__ == '__main__':
a = splayTree()
a.insert(5)
a.insert(1)
a.insert(4)
a.insert(3)
a.insert(2)
a.insert(7)
a.insert(8)
a.insert(2)
print('initial:5,1,4,2,7,8,2')
a.display()
tmp = a.find(2)
print("after find(2):%d"%tmp)
a.display()
print("remove(4)")
a.remove(4)
a.display()

View File

@ -0,0 +1,103 @@
#include<malloc.h>
#include<stdio.h>
#include<vector>
#define SZ 50
using namespace std;
template<typename type>
class stack
{
int capacity;
type *bottom,*top;
public:
stack(int n = SZ);
stack( stack &);
stack(int,type);
stack(vector<type> &);
type pop();
int cp();
void push(type);
bool empty();
type getTop();
};
template<typename type>
stack<type>::stack(int n):capacity(n)
{
bottom = new type[capacity+1];
top = bottom;
}
template<typename type>
stack<type>::stack(int n,type x):capacity(n*2)
{
bottom = new type[capacity+1];
top = bottom;
for(int i = 0;i<n;++i)*(++top) = x;
}
template<typename type>
stack<type>::stack(vector<type> &vc):capacity (vc.size()*2)
{
bottom = new type[capacity+1];
top = bottom;
for(int i = 0;i!=vc.size();++i){
push(vc[i]);
}
}
template<typename type>
stack<type>::stack(stack &s):capacity(s.capacity)
{
bottom = new type[capacity+1];
top = bottom;
for(type *p= s.bottom;p!=s.top;)*(++top) = *(++p);
}
template<typename type>
int stack<type>::cp()
{
return capacity;
}
template<typename type>
bool stack<type>::empty()
{
return bottom == top;
}
template<typename type>
type stack<type>::getTop()
{
return *top;
}
template<typename type>
type stack<type>::pop()
{
if(bottom == top){
printf("the stack is empty now\n");
return 0;
}else{
return *(top--);
}
}
template<typename type>
void stack<type>::push(type x)
{
if(capacity == top-bottom){
bottom = (type *)realloc(bottom,sizeof(type)*(2*capacity+1));
top = bottom+capacity;
}
*(++top) = x;
}
int main()
{
stack<char> sc(5,'z'),scc(sc);
printf("stack copy\n");
while(!scc.empty()){
printf("%c\n",scc.pop());
}
vector<double> vc(50,2.3);
stack<double> sd(vc);
sd.push(3.4);
printf("gettop%lf\n",sd.getTop());
printf("vec copy\n");
while(!sd.empty()){
printf("%lf\n",sd.pop());
}
printf("empty %d\ncapacity%d",sd.empty(),sd.cp());
return 0;
}

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,57 @@
from allOoneDS import AllOne
from time import time
from random import choice,sample,randint
class hashMap:
def __init__(self):
self.op = {"inc":self.inc,"dec":self.dec,"getMaxKey":self.getMaxKey,"getMinKey":self.getMinKey}
self.mp={'':0}
def inc(self,key,n=1):
if key in self.mp:self.mp[key]+=n
else:self.mp[key]=n
def dec(self,key,n=1):
if key not in self.mp:return
if self.mp[key]<=n:del self.mp[key]
else: self.mp[key]-=n
def getMinKey(self):
return min(list(self.mp.keys()),key=lambda key:self.mp[key])
def getMaxKey(self):
return max(list(self.mp.keys()),key=lambda key:self.mp[key])
op_origin = ['inc','dec','getMinKey','getMaxKey']#'getMinKey','getMaxKey','getMinKey','getMaxKey','getMinKey','getMaxKey','getMinKey','getMaxKey']
ch=list('qwertyuiopasdfghjklzxcvbnm')
keys =[ ''.join(sample(ch,i)) for j in range(10) for i in range(1,20,5)]
def testCase(n=1000):
ops=[]
data=[]
for i in range(n):
p = randint(0,len(op_origin)-1)
ops.append(op_origin[p])
if p<2:
data.append([randint(1,5)])
else:data.append([])
return ops,data
def test(repeat=1000):
t1,t2=0,0
for i in range(repeat):
allOne = AllOne()
hsmp = hashMap()
ops,data = testCase()
t1-=time()
for op,datum in zip(ops,data):
allOne.op[op](*datum)
t1+=time()
t2-=time()
for op,datum in zip(ops,data):
hsmp.op[op](*datum)
t2+=time()
return t1,t2
if __name__=='__main__':
t1,t2= test()
print(t1,t2)

View File

@ -0,0 +1,86 @@
class node:
def __init__(self,val = None):
self.val = val
self.isKey = False
self.children = {}
def __getitem__(self,i):
return self.children[i]
def __iter__(self):
return iter(self.children.keys())
def __setitem__(self,i,x):
self.children[i] = x
def __bool__(self):
return self.children!={}
def __str__(self):
return 'val: '+str(self.val)+'\nchildren: '+' '.join(self.children.keys())
def __repr__(self):
return str(self)
class Trie(object):
def __init__(self):
self.root=node('')
self.dic ={'insert':self.insert,'startsWith':self.startsWith,'search':self.search}
def insert(self, word):
"""
Inserts a word into the trie.
:type word: str
:rtype: void
"""
if not word:return
nd = self.root
for i in word:
if i in nd:
nd = nd[i]
else:
newNode= node(i)
nd[i] = newNode
nd = newNode
else:nd.isKey = True
def search(self, word,matchAll='.'):
"""support matchall function eg, 'p.d' matchs 'pad' , 'pid'
"""
self.matchAll = '.'
return self._search(self.root,word)
def _search(self,nd,word):
for idx,i in enumerate(word):
if i==self.matchAll :
for j in nd:
bl =self._search(nd[j],word[idx+1:])
if bl:return True
else:return False
if i in nd:
nd = nd[i]
else:return False
else:return nd.isKey
def startsWith(self, prefix):
"""
Returns if there is any word in the trie that starts with the given prefix.
:type prefix: str
:rtype: bool
"""
nd = self.root
for i in prefix:
if i in nd:
nd= nd[i]
else:return False
return True
def display(self):
print('preOrderTraverse data of the Trie')
self.preOrder(self.root,'')
def preOrder(self,root,s):
s=s+root.val
if root.isKey:
print(s)
for i in root:
self.preOrder(root[i],s)
if __name__=='__main__':
t = Trie()
rsts = [None,None,None,None,None,None,False,True,False,False,False,False,False,True,True,False,True,True,False,False,False,True,True,True]
op = ["insert","insert","insert","insert","insert","insert","search","search","search","search","search","search","search","search","search","startsWith","startsWith","startsWith","startsWith","startsWith","startsWith","startsWith","startsWith","startsWith"]
data = [["app"],["apple"],["beer"],["add"],["jam"],["rental"],["apps"],["app"],["ad"],["applepie"],["rest"],["jan"],["rent"],["beer"],["jam"],["apps"],["app"],["ad"],["applepie"],["rest"],["jan"],["rent"],["beer"],["jam"]]
for i,datum,rst in zip(op,data,rsts):
if t.dic[i](datum[0]) != rst:print(i,datum[0],rst)
t.display()

View File

@ -0,0 +1,96 @@
class winnerTree:
'''if i<lowExt p = (i+offset)//2
else p = (i+n-1-lowExt)//2
offset is a num 2^k-1 just bigger than n
p is the index of tree
i is the index of players
lowExt is the double node num of the lowest layer of the tree
'''
def __init__(self,players,reverse=False):
self.n=len(players)
self.tree = [0]*self.n
players.insert(0,0)
self.players=players
self.reverse=reverse
self.getNum()
self.initTree(1)
def getNum(self):
i=1
while 2*i< self.n:i=i*2
if 2*i ==self. n:
self.lowExt=0
self.s = 2*i-1
else:
self.lowExt = (self.n-i)*2
self.s = i-1
self.offset = 2*i-1
def treeToArray(self,p):
return 2*p-self.offset if p>self.s else 2*p+self.lowExt-self.n+1
def arrayToTree(self,i):
return (i+self.offset)//2 if i<=self.lowExt else (i-self.lowExt+ self.n-1)//2
def win(self,a,b):
return a<b if self.reverse else a>b
def initTree(self,p):
if p>=self.n:
delta = p%2 #!!! good job notice delta mark the lchild or rchlid
return self.players[self.treeToArray(p//2)+delta]
l = self.initTree(2*p)
r = self.initTree(2*p+1)
self.tree[p] = l if self.win(l,r) else r
return self.tree[p]
def winner(self):
idx = 1
while 2*idx<self.n:
idx = 2*idx if self.tree[2*idx] == self.tree[idx] else idx*2+1
num = self.treeToArray(idx)
num = num+1 if self.players[num] !=self.tree[1] else num
return self.tree[1],num
def getOppo(self,i,x,p):
oppo=None
if 2*p<self.n:oppo=self.tree[2*p]
elif i<=self.lowExt:oppo=self.players[i-1+i%2*2]
else:
lpl= self.players[2*p+self.lowExt-self.n+1]
oppo = lpl if lpl!=x else self.players[2*p+self.lowExt-self.n+2]
return oppo
def update(self,i,x):
''' i is 1-indexed which is the num of player
and x is the new val of the player '''
self.players[i]=x
p = self.arrayToTree(i)
oppo =self.getOppo(i,x,p)
self.tree[p] = x if self.win(x,oppo) else oppo
p=p//2
while p:
l = self.tree[p*2]
r = None
if 2*p+1<self.n:r=self.tree[p*2+1] #notice this !!!
else:r = self.players[2*p+self.lowExt-self.n+1]
self.tree[p] = l if self.win(l,r) else r
p=p//2
if __name__ =='__main__':
s= [4,1,6,7,9,5234,0,2,7,4,123]
t = winnerTree(s)
print(t.players,t.tree)
for i in s:
val,idx=t.winner()
print(val,idx)
t.update(idx,-1)
'''
[0, 4, 1, 6, 7, 9, 5234, 0, 2, 7, 4, 123] [0, 5234, 5234, 123, 7, 5234, 7, 123, 4, 7, 5234]
5234 6
123 11
9 5
7 4
7 9
6 3
4 1
4 10
2 8
1 2
'''

29
codes/four/..spec Normal file
View File

@ -0,0 +1,29 @@
# -*- mode: python -*-
block_cipher = None
a = Analysis(['.'],
pathex=['/mnt/c/Users/mbinary/gitrepo/algorithm/codes/four'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='.',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="handle" processorArchitecture="amd64" type="win32" version="1.0.0.0"/>
<dependency>
<dependentAssembly>
<assemblyIdentity language="*" name="Microsoft.Windows.Common-Controls" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" type="win32" version="6.0.0.0"/>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>

Binary file not shown.

View File

@ -0,0 +1,409 @@
(['C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\handle.py'],
['C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four',
'C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four'],
['codecs'],
[],
[],
[],
False,
False,
'3.6.2 |Anaconda custom (64-bit)| (default, Jul 20 2017, 12:30:02) [MSC '
'v.1900 64 bit (AMD64)]',
[('handle',
'C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\handle.py',
'PYSOURCE')],
[('ntpath', 'd:\\applications\\amacpmda3\\lib\\ntpath.py', 'PYMODULE'),
('_strptime', 'd:\\applications\\amacpmda3\\lib\\_strptime.py', 'PYMODULE'),
('datetime', 'd:\\applications\\amacpmda3\\lib\\datetime.py', 'PYMODULE'),
('stringprep', 'd:\\applications\\amacpmda3\\lib\\stringprep.py', 'PYMODULE'),
('stat', 'd:\\applications\\amacpmda3\\lib\\stat.py', 'PYMODULE'),
('genericpath',
'd:\\applications\\amacpmda3\\lib\\genericpath.py',
'PYMODULE'),
('posixpath', 'd:\\applications\\amacpmda3\\lib\\posixpath.py', 'PYMODULE'),
('fnmatch', 'd:\\applications\\amacpmda3\\lib\\fnmatch.py', 'PYMODULE'),
('_compat_pickle',
'd:\\applications\\amacpmda3\\lib\\_compat_pickle.py',
'PYMODULE'),
('__future__', 'd:\\applications\\amacpmda3\\lib\\__future__.py', 'PYMODULE'),
('difflib', 'd:\\applications\\amacpmda3\\lib\\difflib.py', 'PYMODULE'),
('ast', 'd:\\applications\\amacpmda3\\lib\\ast.py', 'PYMODULE'),
('inspect', 'd:\\applications\\amacpmda3\\lib\\inspect.py', 'PYMODULE'),
('cmd', 'd:\\applications\\amacpmda3\\lib\\cmd.py', 'PYMODULE'),
('bdb', 'd:\\applications\\amacpmda3\\lib\\bdb.py', 'PYMODULE'),
('opcode', 'd:\\applications\\amacpmda3\\lib\\opcode.py', 'PYMODULE'),
('dis', 'd:\\applications\\amacpmda3\\lib\\dis.py', 'PYMODULE'),
('codeop', 'd:\\applications\\amacpmda3\\lib\\codeop.py', 'PYMODULE'),
('code', 'd:\\applications\\amacpmda3\\lib\\code.py', 'PYMODULE'),
('glob', 'd:\\applications\\amacpmda3\\lib\\glob.py', 'PYMODULE'),
('shlex', 'd:\\applications\\amacpmda3\\lib\\shlex.py', 'PYMODULE'),
('importlib._bootstrap',
'd:\\applications\\amacpmda3\\lib\\importlib\\_bootstrap.py',
'PYMODULE'),
('importlib._bootstrap_external',
'd:\\applications\\amacpmda3\\lib\\importlib\\_bootstrap_external.py',
'PYMODULE'),
('importlib.machinery',
'd:\\applications\\amacpmda3\\lib\\importlib\\machinery.py',
'PYMODULE'),
('importlib.util',
'd:\\applications\\amacpmda3\\lib\\importlib\\util.py',
'PYMODULE'),
('importlib.abc',
'd:\\applications\\amacpmda3\\lib\\importlib\\abc.py',
'PYMODULE'),
('importlib',
'd:\\applications\\amacpmda3\\lib\\importlib\\__init__.py',
'PYMODULE'),
('pkgutil', 'd:\\applications\\amacpmda3\\lib\\pkgutil.py', 'PYMODULE'),
('xml', 'd:\\applications\\amacpmda3\\lib\\xml\\__init__.py', 'PYMODULE'),
('xml.sax.expatreader',
'd:\\applications\\amacpmda3\\lib\\xml\\sax\\expatreader.py',
'PYMODULE'),
('xml.sax.saxutils',
'd:\\applications\\amacpmda3\\lib\\xml\\sax\\saxutils.py',
'PYMODULE'),
('urllib.request',
'd:\\applications\\amacpmda3\\lib\\urllib\\request.py',
'PYMODULE'),
('getpass', 'd:\\applications\\amacpmda3\\lib\\getpass.py', 'PYMODULE'),
('nturl2path', 'd:\\applications\\amacpmda3\\lib\\nturl2path.py', 'PYMODULE'),
('ftplib', 'd:\\applications\\amacpmda3\\lib\\ftplib.py', 'PYMODULE'),
('netrc', 'd:\\applications\\amacpmda3\\lib\\netrc.py', 'PYMODULE'),
('http.cookiejar',
'd:\\applications\\amacpmda3\\lib\\http\\cookiejar.py',
'PYMODULE'),
('urllib.response',
'd:\\applications\\amacpmda3\\lib\\urllib\\response.py',
'PYMODULE'),
('urllib.error',
'd:\\applications\\amacpmda3\\lib\\urllib\\error.py',
'PYMODULE'),
('xml.sax',
'd:\\applications\\amacpmda3\\lib\\xml\\sax\\__init__.py',
'PYMODULE'),
('xml.sax.handler',
'd:\\applications\\amacpmda3\\lib\\xml\\sax\\handler.py',
'PYMODULE'),
('xml.sax._exceptions',
'd:\\applications\\amacpmda3\\lib\\xml\\sax\\_exceptions.py',
'PYMODULE'),
('xml.sax.xmlreader',
'd:\\applications\\amacpmda3\\lib\\xml\\sax\\xmlreader.py',
'PYMODULE'),
('xml.parsers',
'd:\\applications\\amacpmda3\\lib\\xml\\parsers\\__init__.py',
'PYMODULE'),
('xml.parsers.expat',
'd:\\applications\\amacpmda3\\lib\\xml\\parsers\\expat.py',
'PYMODULE'),
('plistlib', 'd:\\applications\\amacpmda3\\lib\\plistlib.py', 'PYMODULE'),
('platform', 'd:\\applications\\amacpmda3\\lib\\platform.py', 'PYMODULE'),
('urllib.parse',
'd:\\applications\\amacpmda3\\lib\\urllib\\parse.py',
'PYMODULE'),
('tempfile', 'd:\\applications\\amacpmda3\\lib\\tempfile.py', 'PYMODULE'),
('tty', 'd:\\applications\\amacpmda3\\lib\\tty.py', 'PYMODULE'),
('pydoc_data',
'd:\\applications\\amacpmda3\\lib\\pydoc_data\\__init__.py',
'PYMODULE'),
('pydoc_data.topics',
'd:\\applications\\amacpmda3\\lib\\pydoc_data\\topics.py',
'PYMODULE'),
('html.entities',
'd:\\applications\\amacpmda3\\lib\\html\\entities.py',
'PYMODULE'),
('html', 'd:\\applications\\amacpmda3\\lib\\html\\__init__.py', 'PYMODULE'),
('ipaddress', 'd:\\applications\\amacpmda3\\lib\\ipaddress.py', 'PYMODULE'),
('ssl', 'd:\\applications\\amacpmda3\\lib\\ssl.py', 'PYMODULE'),
('http.client',
'd:\\applications\\amacpmda3\\lib\\http\\client.py',
'PYMODULE'),
('mimetypes', 'd:\\applications\\amacpmda3\\lib\\mimetypes.py', 'PYMODULE'),
('socketserver',
'd:\\applications\\amacpmda3\\lib\\socketserver.py',
'PYMODULE'),
('http', 'd:\\applications\\amacpmda3\\lib\\http\\__init__.py', 'PYMODULE'),
('http.server',
'd:\\applications\\amacpmda3\\lib\\http\\server.py',
'PYMODULE'),
('optparse', 'd:\\applications\\amacpmda3\\lib\\optparse.py', 'PYMODULE'),
('uu', 'd:\\applications\\amacpmda3\\lib\\uu.py', 'PYMODULE'),
('quopri', 'd:\\applications\\amacpmda3\\lib\\quopri.py', 'PYMODULE'),
('email.feedparser',
'd:\\applications\\amacpmda3\\lib\\email\\feedparser.py',
'PYMODULE'),
('email.parser',
'd:\\applications\\amacpmda3\\lib\\email\\parser.py',
'PYMODULE'),
('email', 'd:\\applications\\amacpmda3\\lib\\email\\__init__.py', 'PYMODULE'),
('calendar', 'd:\\applications\\amacpmda3\\lib\\calendar.py', 'PYMODULE'),
('email._parseaddr',
'd:\\applications\\amacpmda3\\lib\\email\\_parseaddr.py',
'PYMODULE'),
('email.utils',
'd:\\applications\\amacpmda3\\lib\\email\\utils.py',
'PYMODULE'),
('email.errors',
'd:\\applications\\amacpmda3\\lib\\email\\errors.py',
'PYMODULE'),
('email.header',
'd:\\applications\\amacpmda3\\lib\\email\\header.py',
'PYMODULE'),
('email._policybase',
'd:\\applications\\amacpmda3\\lib\\email\\_policybase.py',
'PYMODULE'),
('email.base64mime',
'd:\\applications\\amacpmda3\\lib\\email\\base64mime.py',
'PYMODULE'),
('email.encoders',
'd:\\applications\\amacpmda3\\lib\\email\\encoders.py',
'PYMODULE'),
('email.charset',
'd:\\applications\\amacpmda3\\lib\\email\\charset.py',
'PYMODULE'),
('base64', 'd:\\applications\\amacpmda3\\lib\\base64.py', 'PYMODULE'),
('email._encoded_words',
'd:\\applications\\amacpmda3\\lib\\email\\_encoded_words.py',
'PYMODULE'),
('hashlib', 'd:\\applications\\amacpmda3\\lib\\hashlib.py', 'PYMODULE'),
('bisect', 'd:\\applications\\amacpmda3\\lib\\bisect.py', 'PYMODULE'),
('email.generator',
'd:\\applications\\amacpmda3\\lib\\email\\generator.py',
'PYMODULE'),
('email.iterators',
'd:\\applications\\amacpmda3\\lib\\email\\iterators.py',
'PYMODULE'),
('urllib',
'd:\\applications\\amacpmda3\\lib\\urllib\\__init__.py',
'PYMODULE'),
('email._header_value_parser',
'd:\\applications\\amacpmda3\\lib\\email\\_header_value_parser.py',
'PYMODULE'),
('email.headerregistry',
'd:\\applications\\amacpmda3\\lib\\email\\headerregistry.py',
'PYMODULE'),
('email.quoprimime',
'd:\\applications\\amacpmda3\\lib\\email\\quoprimime.py',
'PYMODULE'),
('email.contentmanager',
'd:\\applications\\amacpmda3\\lib\\email\\contentmanager.py',
'PYMODULE'),
('email.policy',
'd:\\applications\\amacpmda3\\lib\\email\\policy.py',
'PYMODULE'),
('email.message',
'd:\\applications\\amacpmda3\\lib\\email\\message.py',
'PYMODULE'),
('bz2', 'd:\\applications\\amacpmda3\\lib\\bz2.py', 'PYMODULE'),
('lzma', 'd:\\applications\\amacpmda3\\lib\\lzma.py', 'PYMODULE'),
('_compression',
'd:\\applications\\amacpmda3\\lib\\_compression.py',
'PYMODULE'),
('gzip', 'd:\\applications\\amacpmda3\\lib\\gzip.py', 'PYMODULE'),
('tarfile', 'd:\\applications\\amacpmda3\\lib\\tarfile.py', 'PYMODULE'),
('py_compile', 'd:\\applications\\amacpmda3\\lib\\py_compile.py', 'PYMODULE'),
('zipfile', 'd:\\applications\\amacpmda3\\lib\\zipfile.py', 'PYMODULE'),
('shutil', 'd:\\applications\\amacpmda3\\lib\\shutil.py', 'PYMODULE'),
('socket', 'd:\\applications\\amacpmda3\\lib\\socket.py', 'PYMODULE'),
('webbrowser', 'd:\\applications\\amacpmda3\\lib\\webbrowser.py', 'PYMODULE'),
('pydoc', 'd:\\applications\\amacpmda3\\lib\\pydoc.py', 'PYMODULE'),
('getopt', 'd:\\applications\\amacpmda3\\lib\\getopt.py', 'PYMODULE'),
('pdb', 'd:\\applications\\amacpmda3\\lib\\pdb.py', 'PYMODULE'),
('unittest.util',
'd:\\applications\\amacpmda3\\lib\\unittest\\util.py',
'PYMODULE'),
('unittest.result',
'd:\\applications\\amacpmda3\\lib\\unittest\\result.py',
'PYMODULE'),
('string', 'd:\\applications\\amacpmda3\\lib\\string.py', 'PYMODULE'),
('logging',
'd:\\applications\\amacpmda3\\lib\\logging\\__init__.py',
'PYMODULE'),
('unittest.case',
'd:\\applications\\amacpmda3\\lib\\unittest\\case.py',
'PYMODULE'),
('unittest.suite',
'd:\\applications\\amacpmda3\\lib\\unittest\\suite.py',
'PYMODULE'),
('unittest.loader',
'd:\\applications\\amacpmda3\\lib\\unittest\\loader.py',
'PYMODULE'),
('unittest.runner',
'd:\\applications\\amacpmda3\\lib\\unittest\\runner.py',
'PYMODULE'),
('unittest.main',
'd:\\applications\\amacpmda3\\lib\\unittest\\main.py',
'PYMODULE'),
('unittest.signals',
'd:\\applications\\amacpmda3\\lib\\unittest\\signals.py',
'PYMODULE'),
('unittest',
'd:\\applications\\amacpmda3\\lib\\unittest\\__init__.py',
'PYMODULE'),
('doctest', 'd:\\applications\\amacpmda3\\lib\\doctest.py', 'PYMODULE'),
('pprint', 'd:\\applications\\amacpmda3\\lib\\pprint.py', 'PYMODULE'),
('tracemalloc',
'd:\\applications\\amacpmda3\\lib\\tracemalloc.py',
'PYMODULE'),
('warnings', 'd:\\applications\\amacpmda3\\lib\\warnings.py', 'PYMODULE'),
('enum', 'd:\\applications\\amacpmda3\\lib\\enum.py', 'PYMODULE'),
('signal', 'd:\\applications\\amacpmda3\\lib\\signal.py', 'PYMODULE'),
('contextlib', 'd:\\applications\\amacpmda3\\lib\\contextlib.py', 'PYMODULE'),
('_threading_local',
'd:\\applications\\amacpmda3\\lib\\_threading_local.py',
'PYMODULE'),
('threading', 'd:\\applications\\amacpmda3\\lib\\threading.py', 'PYMODULE'),
('selectors', 'd:\\applications\\amacpmda3\\lib\\selectors.py', 'PYMODULE'),
('_dummy_thread',
'd:\\applications\\amacpmda3\\lib\\_dummy_thread.py',
'PYMODULE'),
('dummy_threading',
'd:\\applications\\amacpmda3\\lib\\dummy_threading.py',
'PYMODULE'),
('subprocess', 'd:\\applications\\amacpmda3\\lib\\subprocess.py', 'PYMODULE'),
('os', 'd:\\applications\\amacpmda3\\lib\\os.py', 'PYMODULE'),
('token', 'd:\\applications\\amacpmda3\\lib\\token.py', 'PYMODULE'),
('copy', 'd:\\applications\\amacpmda3\\lib\\copy.py', 'PYMODULE'),
('textwrap', 'd:\\applications\\amacpmda3\\lib\\textwrap.py', 'PYMODULE'),
('struct', 'd:\\applications\\amacpmda3\\lib\\struct.py', 'PYMODULE'),
('gettext', 'd:\\applications\\amacpmda3\\lib\\gettext.py', 'PYMODULE'),
('argparse', 'd:\\applications\\amacpmda3\\lib\\argparse.py', 'PYMODULE'),
('tokenize', 'd:\\applications\\amacpmda3\\lib\\tokenize.py', 'PYMODULE'),
('random', 'd:\\applications\\amacpmda3\\lib\\random.py', 'PYMODULE'),
('pickle', 'd:\\applications\\amacpmda3\\lib\\pickle.py', 'PYMODULE')],
[('api-ms-win-crt-heap-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-heap-l1-1-0.dll',
'BINARY'),
('VCRUNTIME140.dll',
'd:\\applications\\amacpmda3\\VCRUNTIME140.dll',
'BINARY'),
('api-ms-win-crt-locale-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-locale-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-runtime-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-runtime-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-math-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-math-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-stdio-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-stdio-l1-1-0.dll',
'BINARY'),
('python36.dll', 'd:\\applications\\amacpmda3\\python36.dll', 'BINARY'),
('ucrtbase.dll', 'd:\\applications\\amacpmda3\\ucrtbase.dll', 'BINARY'),
('api-ms-win-crt-convert-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-convert-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-string-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-string-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-environment-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-environment-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-filesystem-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-filesystem-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-process-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-process-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-conio-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-conio-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-time-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-time-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-synch-l1-2-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-synch-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-handle-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-handle-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-file-l2-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-file-l2-1-0.dll',
'BINARY'),
('api-ms-win-core-file-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-file-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-processthreads-l1-1-1.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-processthreads-l1-1-1.dll',
'BINARY'),
('api-ms-win-core-processenvironment-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-processenvironment-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-file-l1-2-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-file-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-rtlsupport-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-rtlsupport-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-debug-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-debug-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-timezone-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-timezone-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-datetime-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-datetime-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-util-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-util-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-errorhandling-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-errorhandling-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-profile-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-profile-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-synch-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-synch-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-libraryloader-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-libraryloader-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-string-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-string-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-localization-l1-2-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-localization-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-interlocked-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-interlocked-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-processthreads-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-processthreads-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-heap-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-heap-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-namedpipe-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-namedpipe-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-sysinfo-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-sysinfo-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-console-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-console-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-memory-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-memory-l1-1-0.dll',
'BINARY'),
('_ssl', 'd:\\applications\\amacpmda3\\DLLs\\_ssl.pyd', 'EXTENSION'),
('unicodedata',
'd:\\applications\\amacpmda3\\DLLs\\unicodedata.pyd',
'EXTENSION'),
('pyexpat', 'd:\\applications\\amacpmda3\\DLLs\\pyexpat.pyd', 'EXTENSION'),
('_hashlib', 'd:\\applications\\amacpmda3\\DLLs\\_hashlib.pyd', 'EXTENSION'),
('_bz2', 'd:\\applications\\amacpmda3\\DLLs\\_bz2.pyd', 'EXTENSION'),
('_lzma', 'd:\\applications\\amacpmda3\\DLLs\\_lzma.pyd', 'EXTENSION'),
('_socket', 'd:\\applications\\amacpmda3\\DLLs\\_socket.pyd', 'EXTENSION'),
('select', 'd:\\applications\\amacpmda3\\DLLs\\select.pyd', 'EXTENSION'),
('api-ms-win-crt-utility-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-utility-l1-1-0.dll',
'BINARY')],
[],
[],
[('base_library.zip',
'C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\build\\handle\\base_library.zip',
'DATA')],
[])

View File

@ -0,0 +1,173 @@
('C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\dist\\handle.exe',
True,
False,
False,
None,
None,
False,
False,
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"><assemblyIdentity name="handle" processorArchitecture="amd64" type="win32" version="1.0.0.0"/><dependency><dependentAssembly><assemblyIdentity language="*" name="Microsoft.Windows.Common-Controls" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" type="win32" version="6.0.0.0"/><compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"/></dependentAssembly></dependency><compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"><application><supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/></application></compatibility></assembly>',
True,
'handle.pkg',
[('out00-PYZ.pyz',
'C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\build\\handle\\out00-PYZ.pyz',
'PYZ'),
('struct', 'd:\\applications\\amacpmda3\\lib\\struct.pyo', 'PYMODULE'),
('pyimod01_os_path',
'd:\\applications\\amacpmda3\\lib\\site-packages\\PyInstaller\\loader\\pyimod01_os_path.pyc',
'PYMODULE'),
('pyimod02_archive',
'd:\\applications\\amacpmda3\\lib\\site-packages\\PyInstaller\\loader\\pyimod02_archive.pyc',
'PYMODULE'),
('pyimod03_importers',
'd:\\applications\\amacpmda3\\lib\\site-packages\\PyInstaller\\loader\\pyimod03_importers.pyc',
'PYMODULE'),
('pyiboot01_bootstrap',
'd:\\applications\\amacpmda3\\lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
'PYSOURCE'),
('handle',
'C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\handle.py',
'PYSOURCE'),
('api-ms-win-crt-heap-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-heap-l1-1-0.dll',
'BINARY'),
('VCRUNTIME140.dll',
'd:\\applications\\amacpmda3\\VCRUNTIME140.dll',
'BINARY'),
('api-ms-win-crt-locale-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-locale-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-runtime-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-runtime-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-math-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-math-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-stdio-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-stdio-l1-1-0.dll',
'BINARY'),
('python36.dll', 'd:\\applications\\amacpmda3\\python36.dll', 'BINARY'),
('ucrtbase.dll', 'd:\\applications\\amacpmda3\\ucrtbase.dll', 'BINARY'),
('api-ms-win-crt-convert-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-convert-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-string-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-string-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-environment-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-environment-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-filesystem-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-filesystem-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-process-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-process-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-conio-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-conio-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-time-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-time-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-synch-l1-2-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-synch-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-handle-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-handle-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-file-l2-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-file-l2-1-0.dll',
'BINARY'),
('api-ms-win-core-file-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-file-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-processthreads-l1-1-1.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-processthreads-l1-1-1.dll',
'BINARY'),
('api-ms-win-core-processenvironment-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-processenvironment-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-file-l1-2-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-file-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-rtlsupport-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-rtlsupport-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-debug-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-debug-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-timezone-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-timezone-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-datetime-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-datetime-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-util-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-util-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-errorhandling-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-errorhandling-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-profile-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-profile-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-synch-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-synch-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-libraryloader-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-libraryloader-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-string-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-string-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-localization-l1-2-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-localization-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-interlocked-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-interlocked-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-processthreads-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-processthreads-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-heap-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-heap-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-namedpipe-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-namedpipe-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-sysinfo-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-sysinfo-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-console-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-console-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-memory-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-memory-l1-1-0.dll',
'BINARY'),
('_ssl', 'd:\\applications\\amacpmda3\\DLLs\\_ssl.pyd', 'EXTENSION'),
('unicodedata',
'd:\\applications\\amacpmda3\\DLLs\\unicodedata.pyd',
'EXTENSION'),
('pyexpat', 'd:\\applications\\amacpmda3\\DLLs\\pyexpat.pyd', 'EXTENSION'),
('_hashlib', 'd:\\applications\\amacpmda3\\DLLs\\_hashlib.pyd', 'EXTENSION'),
('_bz2', 'd:\\applications\\amacpmda3\\DLLs\\_bz2.pyd', 'EXTENSION'),
('_lzma', 'd:\\applications\\amacpmda3\\DLLs\\_lzma.pyd', 'EXTENSION'),
('_socket', 'd:\\applications\\amacpmda3\\DLLs\\_socket.pyd', 'EXTENSION'),
('select', 'd:\\applications\\amacpmda3\\DLLs\\select.pyd', 'EXTENSION'),
('api-ms-win-crt-utility-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-utility-l1-1-0.dll',
'BINARY'),
('base_library.zip',
'C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\build\\handle\\base_library.zip',
'DATA'),
('handle.exe.manifest',
'C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\build\\handle\\handle.exe.manifest',
'BINARY'),
('pyi-windows-manifest-filename handle.exe.manifest', '', 'OPTION')],
[],
False,
False,
1530888531,
[('run.exe',
'd:\\applications\\amacpmda3\\lib\\site-packages\\PyInstaller\\bootloader\\Windows-64bit\\run.exe',
'EXECUTABLE')])

Binary file not shown.

View File

@ -0,0 +1,166 @@
('C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\build\\handle\\out00-PKG.pkg',
{'BINARY': 1,
'DATA': 1,
'EXECUTABLE': 1,
'EXTENSION': 1,
'PYMODULE': 1,
'PYSOURCE': 1,
'PYZ': 0},
[('out00-PYZ.pyz',
'C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\build\\handle\\out00-PYZ.pyz',
'PYZ'),
('struct', 'd:\\applications\\amacpmda3\\lib\\struct.pyo', 'PYMODULE'),
('pyimod01_os_path',
'd:\\applications\\amacpmda3\\lib\\site-packages\\PyInstaller\\loader\\pyimod01_os_path.pyc',
'PYMODULE'),
('pyimod02_archive',
'd:\\applications\\amacpmda3\\lib\\site-packages\\PyInstaller\\loader\\pyimod02_archive.pyc',
'PYMODULE'),
('pyimod03_importers',
'd:\\applications\\amacpmda3\\lib\\site-packages\\PyInstaller\\loader\\pyimod03_importers.pyc',
'PYMODULE'),
('pyiboot01_bootstrap',
'd:\\applications\\amacpmda3\\lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
'PYSOURCE'),
('handle',
'C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\handle.py',
'PYSOURCE'),
('api-ms-win-crt-heap-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-heap-l1-1-0.dll',
'BINARY'),
('VCRUNTIME140.dll',
'd:\\applications\\amacpmda3\\VCRUNTIME140.dll',
'BINARY'),
('api-ms-win-crt-locale-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-locale-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-runtime-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-runtime-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-math-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-math-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-stdio-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-stdio-l1-1-0.dll',
'BINARY'),
('python36.dll', 'd:\\applications\\amacpmda3\\python36.dll', 'BINARY'),
('ucrtbase.dll', 'd:\\applications\\amacpmda3\\ucrtbase.dll', 'BINARY'),
('api-ms-win-crt-convert-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-convert-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-string-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-string-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-environment-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-environment-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-filesystem-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-filesystem-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-process-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-process-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-conio-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-conio-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-time-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-time-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-synch-l1-2-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-synch-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-handle-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-handle-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-file-l2-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-file-l2-1-0.dll',
'BINARY'),
('api-ms-win-core-file-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-file-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-processthreads-l1-1-1.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-processthreads-l1-1-1.dll',
'BINARY'),
('api-ms-win-core-processenvironment-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-processenvironment-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-file-l1-2-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-file-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-rtlsupport-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-rtlsupport-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-debug-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-debug-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-timezone-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-timezone-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-datetime-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-datetime-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-util-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-util-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-errorhandling-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-errorhandling-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-profile-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-profile-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-synch-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-synch-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-libraryloader-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-libraryloader-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-string-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-string-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-localization-l1-2-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-localization-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-interlocked-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-interlocked-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-processthreads-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-processthreads-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-heap-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-heap-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-namedpipe-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-namedpipe-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-sysinfo-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-sysinfo-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-console-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-console-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-memory-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-core-memory-l1-1-0.dll',
'BINARY'),
('_ssl', 'd:\\applications\\amacpmda3\\DLLs\\_ssl.pyd', 'EXTENSION'),
('unicodedata',
'd:\\applications\\amacpmda3\\DLLs\\unicodedata.pyd',
'EXTENSION'),
('pyexpat', 'd:\\applications\\amacpmda3\\DLLs\\pyexpat.pyd', 'EXTENSION'),
('_hashlib', 'd:\\applications\\amacpmda3\\DLLs\\_hashlib.pyd', 'EXTENSION'),
('_bz2', 'd:\\applications\\amacpmda3\\DLLs\\_bz2.pyd', 'EXTENSION'),
('_lzma', 'd:\\applications\\amacpmda3\\DLLs\\_lzma.pyd', 'EXTENSION'),
('_socket', 'd:\\applications\\amacpmda3\\DLLs\\_socket.pyd', 'EXTENSION'),
('select', 'd:\\applications\\amacpmda3\\DLLs\\select.pyd', 'EXTENSION'),
('api-ms-win-crt-utility-l1-1-0.dll',
'd:\\applications\\amacpmda3\\api-ms-win-crt-utility-l1-1-0.dll',
'BINARY'),
('base_library.zip',
'C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\build\\handle\\base_library.zip',
'DATA'),
('handle.exe.manifest',
'C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\build\\handle\\handle.exe.manifest',
'BINARY'),
('pyi-windows-manifest-filename handle.exe.manifest', '', 'OPTION')],
False,
False,
False)

Binary file not shown.

View File

@ -0,0 +1,261 @@
('C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four\\build\\handle\\out00-PYZ.pyz',
[('ntpath', 'd:\\applications\\amacpmda3\\lib\\ntpath.py', 'PYMODULE'),
('_strptime', 'd:\\applications\\amacpmda3\\lib\\_strptime.py', 'PYMODULE'),
('datetime', 'd:\\applications\\amacpmda3\\lib\\datetime.py', 'PYMODULE'),
('stringprep', 'd:\\applications\\amacpmda3\\lib\\stringprep.py', 'PYMODULE'),
('stat', 'd:\\applications\\amacpmda3\\lib\\stat.py', 'PYMODULE'),
('genericpath',
'd:\\applications\\amacpmda3\\lib\\genericpath.py',
'PYMODULE'),
('posixpath', 'd:\\applications\\amacpmda3\\lib\\posixpath.py', 'PYMODULE'),
('fnmatch', 'd:\\applications\\amacpmda3\\lib\\fnmatch.py', 'PYMODULE'),
('_compat_pickle',
'd:\\applications\\amacpmda3\\lib\\_compat_pickle.py',
'PYMODULE'),
('__future__', 'd:\\applications\\amacpmda3\\lib\\__future__.py', 'PYMODULE'),
('difflib', 'd:\\applications\\amacpmda3\\lib\\difflib.py', 'PYMODULE'),
('ast', 'd:\\applications\\amacpmda3\\lib\\ast.py', 'PYMODULE'),
('inspect', 'd:\\applications\\amacpmda3\\lib\\inspect.py', 'PYMODULE'),
('cmd', 'd:\\applications\\amacpmda3\\lib\\cmd.py', 'PYMODULE'),
('bdb', 'd:\\applications\\amacpmda3\\lib\\bdb.py', 'PYMODULE'),
('opcode', 'd:\\applications\\amacpmda3\\lib\\opcode.py', 'PYMODULE'),
('dis', 'd:\\applications\\amacpmda3\\lib\\dis.py', 'PYMODULE'),
('codeop', 'd:\\applications\\amacpmda3\\lib\\codeop.py', 'PYMODULE'),
('code', 'd:\\applications\\amacpmda3\\lib\\code.py', 'PYMODULE'),
('glob', 'd:\\applications\\amacpmda3\\lib\\glob.py', 'PYMODULE'),
('shlex', 'd:\\applications\\amacpmda3\\lib\\shlex.py', 'PYMODULE'),
('importlib._bootstrap',
'd:\\applications\\amacpmda3\\lib\\importlib\\_bootstrap.py',
'PYMODULE'),
('importlib._bootstrap_external',
'd:\\applications\\amacpmda3\\lib\\importlib\\_bootstrap_external.py',
'PYMODULE'),
('importlib.machinery',
'd:\\applications\\amacpmda3\\lib\\importlib\\machinery.py',
'PYMODULE'),
('importlib.util',
'd:\\applications\\amacpmda3\\lib\\importlib\\util.py',
'PYMODULE'),
('importlib.abc',
'd:\\applications\\amacpmda3\\lib\\importlib\\abc.py',
'PYMODULE'),
('importlib',
'd:\\applications\\amacpmda3\\lib\\importlib\\__init__.py',
'PYMODULE'),
('pkgutil', 'd:\\applications\\amacpmda3\\lib\\pkgutil.py', 'PYMODULE'),
('xml', 'd:\\applications\\amacpmda3\\lib\\xml\\__init__.py', 'PYMODULE'),
('xml.sax.expatreader',
'd:\\applications\\amacpmda3\\lib\\xml\\sax\\expatreader.py',
'PYMODULE'),
('xml.sax.saxutils',
'd:\\applications\\amacpmda3\\lib\\xml\\sax\\saxutils.py',
'PYMODULE'),
('urllib.request',
'd:\\applications\\amacpmda3\\lib\\urllib\\request.py',
'PYMODULE'),
('getpass', 'd:\\applications\\amacpmda3\\lib\\getpass.py', 'PYMODULE'),
('nturl2path', 'd:\\applications\\amacpmda3\\lib\\nturl2path.py', 'PYMODULE'),
('ftplib', 'd:\\applications\\amacpmda3\\lib\\ftplib.py', 'PYMODULE'),
('netrc', 'd:\\applications\\amacpmda3\\lib\\netrc.py', 'PYMODULE'),
('http.cookiejar',
'd:\\applications\\amacpmda3\\lib\\http\\cookiejar.py',
'PYMODULE'),
('urllib.response',
'd:\\applications\\amacpmda3\\lib\\urllib\\response.py',
'PYMODULE'),
('urllib.error',
'd:\\applications\\amacpmda3\\lib\\urllib\\error.py',
'PYMODULE'),
('xml.sax',
'd:\\applications\\amacpmda3\\lib\\xml\\sax\\__init__.py',
'PYMODULE'),
('xml.sax.handler',
'd:\\applications\\amacpmda3\\lib\\xml\\sax\\handler.py',
'PYMODULE'),
('xml.sax._exceptions',
'd:\\applications\\amacpmda3\\lib\\xml\\sax\\_exceptions.py',
'PYMODULE'),
('xml.sax.xmlreader',
'd:\\applications\\amacpmda3\\lib\\xml\\sax\\xmlreader.py',
'PYMODULE'),
('xml.parsers',
'd:\\applications\\amacpmda3\\lib\\xml\\parsers\\__init__.py',
'PYMODULE'),
('xml.parsers.expat',
'd:\\applications\\amacpmda3\\lib\\xml\\parsers\\expat.py',
'PYMODULE'),
('plistlib', 'd:\\applications\\amacpmda3\\lib\\plistlib.py', 'PYMODULE'),
('platform', 'd:\\applications\\amacpmda3\\lib\\platform.py', 'PYMODULE'),
('urllib.parse',
'd:\\applications\\amacpmda3\\lib\\urllib\\parse.py',
'PYMODULE'),
('tempfile', 'd:\\applications\\amacpmda3\\lib\\tempfile.py', 'PYMODULE'),
('tty', 'd:\\applications\\amacpmda3\\lib\\tty.py', 'PYMODULE'),
('pydoc_data',
'd:\\applications\\amacpmda3\\lib\\pydoc_data\\__init__.py',
'PYMODULE'),
('pydoc_data.topics',
'd:\\applications\\amacpmda3\\lib\\pydoc_data\\topics.py',
'PYMODULE'),
('html.entities',
'd:\\applications\\amacpmda3\\lib\\html\\entities.py',
'PYMODULE'),
('html', 'd:\\applications\\amacpmda3\\lib\\html\\__init__.py', 'PYMODULE'),
('ipaddress', 'd:\\applications\\amacpmda3\\lib\\ipaddress.py', 'PYMODULE'),
('ssl', 'd:\\applications\\amacpmda3\\lib\\ssl.py', 'PYMODULE'),
('http.client',
'd:\\applications\\amacpmda3\\lib\\http\\client.py',
'PYMODULE'),
('mimetypes', 'd:\\applications\\amacpmda3\\lib\\mimetypes.py', 'PYMODULE'),
('socketserver',
'd:\\applications\\amacpmda3\\lib\\socketserver.py',
'PYMODULE'),
('http', 'd:\\applications\\amacpmda3\\lib\\http\\__init__.py', 'PYMODULE'),
('http.server',
'd:\\applications\\amacpmda3\\lib\\http\\server.py',
'PYMODULE'),
('optparse', 'd:\\applications\\amacpmda3\\lib\\optparse.py', 'PYMODULE'),
('uu', 'd:\\applications\\amacpmda3\\lib\\uu.py', 'PYMODULE'),
('quopri', 'd:\\applications\\amacpmda3\\lib\\quopri.py', 'PYMODULE'),
('email.feedparser',
'd:\\applications\\amacpmda3\\lib\\email\\feedparser.py',
'PYMODULE'),
('email.parser',
'd:\\applications\\amacpmda3\\lib\\email\\parser.py',
'PYMODULE'),
('email', 'd:\\applications\\amacpmda3\\lib\\email\\__init__.py', 'PYMODULE'),
('calendar', 'd:\\applications\\amacpmda3\\lib\\calendar.py', 'PYMODULE'),
('email._parseaddr',
'd:\\applications\\amacpmda3\\lib\\email\\_parseaddr.py',
'PYMODULE'),
('email.utils',
'd:\\applications\\amacpmda3\\lib\\email\\utils.py',
'PYMODULE'),
('email.errors',
'd:\\applications\\amacpmda3\\lib\\email\\errors.py',
'PYMODULE'),
('email.header',
'd:\\applications\\amacpmda3\\lib\\email\\header.py',
'PYMODULE'),
('email._policybase',
'd:\\applications\\amacpmda3\\lib\\email\\_policybase.py',
'PYMODULE'),
('email.base64mime',
'd:\\applications\\amacpmda3\\lib\\email\\base64mime.py',
'PYMODULE'),
('email.encoders',
'd:\\applications\\amacpmda3\\lib\\email\\encoders.py',
'PYMODULE'),
('email.charset',
'd:\\applications\\amacpmda3\\lib\\email\\charset.py',
'PYMODULE'),
('base64', 'd:\\applications\\amacpmda3\\lib\\base64.py', 'PYMODULE'),
('email._encoded_words',
'd:\\applications\\amacpmda3\\lib\\email\\_encoded_words.py',
'PYMODULE'),
('hashlib', 'd:\\applications\\amacpmda3\\lib\\hashlib.py', 'PYMODULE'),
('bisect', 'd:\\applications\\amacpmda3\\lib\\bisect.py', 'PYMODULE'),
('email.generator',
'd:\\applications\\amacpmda3\\lib\\email\\generator.py',
'PYMODULE'),
('email.iterators',
'd:\\applications\\amacpmda3\\lib\\email\\iterators.py',
'PYMODULE'),
('urllib',
'd:\\applications\\amacpmda3\\lib\\urllib\\__init__.py',
'PYMODULE'),
('email._header_value_parser',
'd:\\applications\\amacpmda3\\lib\\email\\_header_value_parser.py',
'PYMODULE'),
('email.headerregistry',
'd:\\applications\\amacpmda3\\lib\\email\\headerregistry.py',
'PYMODULE'),
('email.quoprimime',
'd:\\applications\\amacpmda3\\lib\\email\\quoprimime.py',
'PYMODULE'),
('email.contentmanager',
'd:\\applications\\amacpmda3\\lib\\email\\contentmanager.py',
'PYMODULE'),
('email.policy',
'd:\\applications\\amacpmda3\\lib\\email\\policy.py',
'PYMODULE'),
('email.message',
'd:\\applications\\amacpmda3\\lib\\email\\message.py',
'PYMODULE'),
('bz2', 'd:\\applications\\amacpmda3\\lib\\bz2.py', 'PYMODULE'),
('lzma', 'd:\\applications\\amacpmda3\\lib\\lzma.py', 'PYMODULE'),
('_compression',
'd:\\applications\\amacpmda3\\lib\\_compression.py',
'PYMODULE'),
('gzip', 'd:\\applications\\amacpmda3\\lib\\gzip.py', 'PYMODULE'),
('tarfile', 'd:\\applications\\amacpmda3\\lib\\tarfile.py', 'PYMODULE'),
('py_compile', 'd:\\applications\\amacpmda3\\lib\\py_compile.py', 'PYMODULE'),
('zipfile', 'd:\\applications\\amacpmda3\\lib\\zipfile.py', 'PYMODULE'),
('shutil', 'd:\\applications\\amacpmda3\\lib\\shutil.py', 'PYMODULE'),
('socket', 'd:\\applications\\amacpmda3\\lib\\socket.py', 'PYMODULE'),
('webbrowser', 'd:\\applications\\amacpmda3\\lib\\webbrowser.py', 'PYMODULE'),
('pydoc', 'd:\\applications\\amacpmda3\\lib\\pydoc.py', 'PYMODULE'),
('getopt', 'd:\\applications\\amacpmda3\\lib\\getopt.py', 'PYMODULE'),
('pdb', 'd:\\applications\\amacpmda3\\lib\\pdb.py', 'PYMODULE'),
('unittest.util',
'd:\\applications\\amacpmda3\\lib\\unittest\\util.py',
'PYMODULE'),
('unittest.result',
'd:\\applications\\amacpmda3\\lib\\unittest\\result.py',
'PYMODULE'),
('string', 'd:\\applications\\amacpmda3\\lib\\string.py', 'PYMODULE'),
('logging',
'd:\\applications\\amacpmda3\\lib\\logging\\__init__.py',
'PYMODULE'),
('unittest.case',
'd:\\applications\\amacpmda3\\lib\\unittest\\case.py',
'PYMODULE'),
('unittest.suite',
'd:\\applications\\amacpmda3\\lib\\unittest\\suite.py',
'PYMODULE'),
('unittest.loader',
'd:\\applications\\amacpmda3\\lib\\unittest\\loader.py',
'PYMODULE'),
('unittest.runner',
'd:\\applications\\amacpmda3\\lib\\unittest\\runner.py',
'PYMODULE'),
('unittest.main',
'd:\\applications\\amacpmda3\\lib\\unittest\\main.py',
'PYMODULE'),
('unittest.signals',
'd:\\applications\\amacpmda3\\lib\\unittest\\signals.py',
'PYMODULE'),
('unittest',
'd:\\applications\\amacpmda3\\lib\\unittest\\__init__.py',
'PYMODULE'),
('doctest', 'd:\\applications\\amacpmda3\\lib\\doctest.py', 'PYMODULE'),
('pprint', 'd:\\applications\\amacpmda3\\lib\\pprint.py', 'PYMODULE'),
('tracemalloc',
'd:\\applications\\amacpmda3\\lib\\tracemalloc.py',
'PYMODULE'),
('warnings', 'd:\\applications\\amacpmda3\\lib\\warnings.py', 'PYMODULE'),
('enum', 'd:\\applications\\amacpmda3\\lib\\enum.py', 'PYMODULE'),
('signal', 'd:\\applications\\amacpmda3\\lib\\signal.py', 'PYMODULE'),
('contextlib', 'd:\\applications\\amacpmda3\\lib\\contextlib.py', 'PYMODULE'),
('_threading_local',
'd:\\applications\\amacpmda3\\lib\\_threading_local.py',
'PYMODULE'),
('threading', 'd:\\applications\\amacpmda3\\lib\\threading.py', 'PYMODULE'),
('selectors', 'd:\\applications\\amacpmda3\\lib\\selectors.py', 'PYMODULE'),
('_dummy_thread',
'd:\\applications\\amacpmda3\\lib\\_dummy_thread.py',
'PYMODULE'),
('dummy_threading',
'd:\\applications\\amacpmda3\\lib\\dummy_threading.py',
'PYMODULE'),
('subprocess', 'd:\\applications\\amacpmda3\\lib\\subprocess.py', 'PYMODULE'),
('os', 'd:\\applications\\amacpmda3\\lib\\os.py', 'PYMODULE'),
('token', 'd:\\applications\\amacpmda3\\lib\\token.py', 'PYMODULE'),
('copy', 'd:\\applications\\amacpmda3\\lib\\copy.py', 'PYMODULE'),
('textwrap', 'd:\\applications\\amacpmda3\\lib\\textwrap.py', 'PYMODULE'),
('struct', 'd:\\applications\\amacpmda3\\lib\\struct.py', 'PYMODULE'),
('gettext', 'd:\\applications\\amacpmda3\\lib\\gettext.py', 'PYMODULE'),
('argparse', 'd:\\applications\\amacpmda3\\lib\\argparse.py', 'PYMODULE'),
('tokenize', 'd:\\applications\\amacpmda3\\lib\\tokenize.py', 'PYMODULE'),
('random', 'd:\\applications\\amacpmda3\\lib\\random.py', 'PYMODULE'),
('pickle', 'd:\\applications\\amacpmda3\\lib\\pickle.py', 'PYMODULE')])

View File

@ -0,0 +1,17 @@
missing module named resource - imported by posix, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py
missing module named posix - imported by os, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py
missing module named _posixsubprocess - imported by subprocess, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py
missing module named 'org.python' - imported by pickle, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py, xml.sax
missing module named readline - imported by cmd, code, pdb, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py
excluded module named _frozen_importlib - imported by importlib, importlib.abc, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py
missing module named _frozen_importlib_external - imported by importlib._bootstrap, importlib, importlib.abc, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py
missing module named _winreg - imported by platform, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py
missing module named _scproxy - imported by urllib.request
missing module named java - imported by platform, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py
missing module named 'java.lang' - imported by platform, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py, xml.sax._exceptions
missing module named vms_lib - imported by platform, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py
missing module named termios - imported by tty, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py, getpass
missing module named grp - imported by shutil, tarfile, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py
missing module named pwd - imported by posixpath, shutil, tarfile, http.server, webbrowser, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py, netrc, getpass
missing module named _dummy_threading - imported by dummy_threading, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py
missing module named org - imported by copy, C:\Users\mbinary\gitrepo\algorithm\codes\four\handle.py

File diff suppressed because it is too large Load Diff

BIN
codes/four/dist/four.pk vendored Normal file

Binary file not shown.

BIN
codes/four/dist/handle vendored Normal file

Binary file not shown.

BIN
codes/four/dist/handle.exe vendored Normal file

Binary file not shown.

BIN
codes/four/four.pk Normal file

Binary file not shown.

89
codes/four/handle.py Normal file
View File

@ -0,0 +1,89 @@
from pickle import load,dump
from random import randint
def next(dic,s,li):
if s[-1] not in dic:
if len(li)>10:print(li)
return
for i in dic[s[-1]]:
if i in li: continue
next(dic,i,li+[i])
def gen(dic):
for i in dic:
for j in dic[i]:
next(dic,j,[j])
class node:
def __init__(self,val):
self.val = val
self.chd={}
self.prt={}
def to(self,nd):
if nd.val not in self.chd:
self.chd[nd.val] = nd
nd.prt[self.val] = self
def __getitem__(self,i):
return self.val[i]
def __str__(self):
return '{}->{}'.format(self.val,list(self.chd.keys()))
def __repr__(self):
return 'node({})'.format(self.val)
def __len__(self):
return len(self.chd)
class graph:
def __init__(self):
self.data = {}
def addNode(self,s):
if s not in self.data:
nd = node(s)
for i,j in self.data.items():
if i[-1]==nd[0]: j.to(nd)
if i[0]== nd[-1]: nd.to(j)
self.data[s] = nd
def __str__(self):
print()
def __getitem(self,i):
return self.data[i]
def clean(dic):
g = graph()
for i in dic:
for j in dic[i]:
g.addNode(j)
dic = {}
for i,j in g.data.items():
if j.chd=={} and j.prt=={}: continue
if i[0] in dic: dic[i[0]].append(i)
else:dic[i[0]] = [i]
with open('four.pk','wb') as f:
dump(dic,f)
def play():
def once(last):
word = last[-1]
if word[-1] not in dic:
if len(last)>1:
print('{}-> '.format(last))
print('-'*5+'end'+'-'*5)
return
else:
print('{}-> '.format(last))
lst = dic[word[-1]]
for i,j in enumerate(lst):
print('{}. {}'.format(i,j))
print('q. quit')
choose = input('>>> ')
if choose == 'q':return
once(last+[lst[int(choose)%len(lst)]])
lst = dic[li[randint(0,n-1)]]
word = lst[randint(0,len(lst)-1)]
once([word])
if __name__ =='__main__':
dic=None
with open('four.pk','rb') as f:
dic = load(f)
li = list(dic.keys())
n = len(li)
while 1:play()

29
codes/four/handle.spec Normal file
View File

@ -0,0 +1,29 @@
# -*- mode: python -*-
block_cipher = None
a = Analysis(['handle.py'],
pathex=['C:\\Users\\mbinary\\gitrepo\\algorithm\\codes\\four'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='handle',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )

103
codes/hashTable.py Normal file
View File

@ -0,0 +1,103 @@
class item:
def __init__(self,key,val,nextItem=None):
self.key = key
self.val = val
self.next = nextItem
def to(self,it):
self.next = it
def __eq__(self,it):
'''using keyword <in> '''
return self.key == it.key
def __bool__(self):
return self.key is not None
def __str__(self):
li = []
nd = self
while nd:
li.append(f'({nd.key}:{nd.val})')
nd = nd.next
return ' -> '.join(li)
def __repr__(self):
return f'item({self.key},{self.val})'
class hashTable:
def __init__(self,size=100):
self.size = size
self.slots=[item(None,None) for i in range(self.size)]
def __setitem__(self,key,val):
nd = self.slots[self.myhash(key)]
while nd.next:
if nd.key ==key:
if nd.val!=val: nd.val=val
return
nd = nd.next
nd.next = item(key,val)
def myhash(self,key):
if isinstance(key,str):
key = sum(ord(i) for i in key)
if not isinstance(key,int):
key = hash(key)
return key % self.size
def __iter__(self):
'''when using keyword <in>, such as ' if key in dic',
the dic's __iter__ method will be called,(if hasn't, calls __getitem__
then ~iterate~ dic's keys to compare whether one equls to the key
'''
for nd in self.slots:
nd = nd.next
while nd :
yield nd.key
nd = nd.next
def __getitem__(self,key):
nd =self.slots[ self.myhash(key)].next
while nd:
if nd.key==key:
return nd.val
nd = nd.next
raise Exception(f'[KeyError]: {self.__class__.__name__} has no key {key}')
def __delitem__(self,key):
'''note that None item and item(None,None) differ with each other,
which means you should take care of them and correctly cop with None item
especially when deleting items
'''
n = self.myhash(key)
nd = self.slots[n].next
if nd.key == key:
if nd.next is None:
self.slots[n] = item(None,None) # be careful
else:self.slots[n] = nd.next
return
while nd:
if nd.next is None: break # necessary
if nd.next.key ==key:
nd.next = nd.next.next
nd = nd.next
def __str__(self):
li = ['\n\n'+'-'*5+'hashTable'+'-'*5]
for i,nd in enumerate(self.slots):
li.append(f'{i}: '+str(nd.next))
return '\n'.join(li)
if __name__ =='__main__':
from random import randint
dic = hashTable(16)
n = 100
li = [1,2,5,40,324,123,6,22,18,34,50]
print(f'build hashTable using {li}')
for i in li:
dic[i] = '$'+str(i)
print(dic)
for i in [1,34,45,123]:
if i in dic:
print(f'{i} in dic, deleting it')
del dic[i]
else:
print(f'{i} not in dic, ignore it')
print(dic)
print(f'dic[2] is {dic[2]}')
try:
dic[-1]
except Exception as e:
print(e)

26
codes/manacher.py Normal file
View File

@ -0,0 +1,26 @@
class Solution:
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
n = len(s)
s2='$#'+'#'.join(s)+'#@'
ct =[0]*(2*n+4)
mid=1
for cur in range(1,2*n+2):
if cur<mid+ct[mid]:
ct[cur] = min(ct[2*mid-cur],mid+ct[mid]-cur)
else:
ct[cur]=1
while s2[cur-ct[cur]]==s2[cur+ct[cur]]:
ct[cur]+=1
if cur+ct[cur] > mid+ct[mid]:mid = cur
mx = max(ct)
idxs = [i for i,j in enumerate(ct) if j == mx]
p = idxs[0]
for i in idxs:
if s2[i]=='#':p = i
rst =s2[p-mx+1:p+mx].replace('#','')
return rst

46
codes/markov.py Normal file
View File

@ -0,0 +1,46 @@
from random import randint
import re
class markov:
def __init__(self,txt):
self.words= self.clean(txt)
self.dic = self.getDic(self.words)
def clean(self,text):
text = text.replace("\n", " ");
text = text.replace("\"", "");
# 保证每个标点符号都和前面的单词在一起
# 这样不会被剔除,保留在马尔可夫链中
punctuation = [',', '.', ';',':']
for symbol in punctuation:
text = text.replace(symbol, symbol+" ");
return re.split(' +',text)
def getDic(self,words):
dic = {}
end = len(words)
for i in range(1,end):
if words[i-1] not in dic:
dic[words[i-1]] = {words[i]:1}
elif words[i] not in dic[words[i-1]]:
dic[words[i-1]][words[i]] = 1
else: dic[words[i-1]][words[i]] +=1
return dic
def getSum(self,dic):
if '%size' not in dic:
dic['%size'] = sum(list(dic.values()))
return dic['%size']
def nextWord(self,word):
k = randint(1,self.getSum(self.dic[word]))
for i,j in self.dic[word].items():
k-=j
if k<=0:return i
def genSentence(self,begin = 'I',length = 30):
li = [begin]
nextWord= begin
for i in range(1,length):
nextWord= self.nextWord(nextWord)
li.append(nextWord)
return ' '.join(li)

Binary file not shown.

72
codes/sort/heapSort.py Normal file
View File

@ -0,0 +1,72 @@
from functools import partial
class heap:
def __init__(self,lst,reverse = False):
self.data= heapify(lst,reverse)
self.cmp = partial(lambda i,j,r:cmp(self.data[i],self.data[j],r),r= reverse)
def getTop(self):
return self.data[0]
def __getitem__(self,idx):
return self.data[idx]
def __bool__(self):
return self.data != []
def popTop(self):
ret = self.data[0]
n = len(self.data)
cur = 1
while cur * 2<=n:
chd = cur-1
r_idx = cur*2
l_idx = r_idx-1
if r_idx==n:
self.data[chd] = self.data[l_idx]
break
j = l_idx if self.cmp(l_idx,r_idx)<0 else r_idx
self.data[chd] = self.data[j]
cur = j+1
self.data[cur-1] = self.data[-1]
self.data.pop()
return ret
def addNode(self,val):
self.data.append(val)
self.data = one_heapify(len(self.data)-1)
def cmp(n1,n2,reverse=False):
fac = -1 if reverse else 1
if n1 < n2: return -fac
elif n1 > n2: return fac
return 0
def heapify(lst,reverse = False):
for i in range(len(lst)):
lst = one_heapify(lst,i,reverse)
return lst
def one_heapify(lst,cur,reverse = False):
cur +=1
while cur>1:
chd = cur-1
prt = cur//2-1
if cmp(lst[prt],lst[chd],reverse)<0:
break
lst[prt],lst[chd] = lst[chd], lst[prt]
cur = prt+1
return lst
def heapSort(lst,reverse = False):
lst = lst.copy()
hp = heap(lst,reverse)
ret = []
while hp:
ret.append(hp.popTop())
return ret
if __name__ == '__main__':
from random import randint
n = randint(10,20)
lst = [randint(0,100) for i in range(n)]
print('random : ', lst)
print('small-heap: ', heapify(lst))
print('big-heap : ', heapify(lst,True))
print('ascend : ', heapSort(lst))
print('descend : ', heapSort(lst,True))

95
codes/sort/quickSort.py Normal file
View File

@ -0,0 +1,95 @@
def quickSort(lst):
'''A optimized version of Hoare partition'''
def partition(a,b):
pivot = lst[a]
while a!=b:
while a<b and lst[b]>pivot: b-=1
if a<b:
lst[a] = lst[b]
a+=1
while a<b and lst[a]<pivot: a+=1
if a<b:
lst[b] = lst[a]
b-=1
lst[a] = pivot
return a
def _sort(a,b):
if a>=b:return
mid = (a+b)//2
# 三数取中值置于第一个作为 pivot
if (lst[a]<lst[mid]) ^ (lst[b]<lst[mid]): lst[a],lst[mid] = lst[mid],lst[a] # lst[mid] 为中值
if (lst[a]<lst[b]) ^ (lst[b]>lst[mid]): lst[a],lst[b] = lst[b],lst[a] # lst[b] 为中值
i = partition(a,b)
_sort(a,i-1)
_sort(i+1,b)
_sort(0,len(lst)-1)
return lst
def quickSort2(lst):
'''A version of partition from <Introduction of Algorithm>, a little bit slow'''
def partition(a,b):
pivot = lst[b]
j = a-1
for i in range(a,b):
if lst[i]<=pivot:
j+=1
if i!=j: lst[i], lst[j] = lst[j], lst[i]
lst[j+1],lst[b] = lst[b],lst[j+1]
return j+1
def _sort(a,b):
if a>=b:return
mid = (a+b)//2
# 三数取中值置于第一个作为 pivot
if (lst[a]<lst[mid]) ^ (lst[b]<lst[mid]): lst[b],lst[mid] = lst[mid],lst[b] # lst[mid] 为中值
if (lst[a]>lst[b]) ^ (lst[a]>lst[mid]): lst[a],lst[b] = lst[b],lst[a] # lst[b] 为中值
i = partition(a,b)
_sort(a,i-1)
_sort(i+1,b)
_sort(0,len(lst)-1)
return lst
def quickSort3(lst):
'''A rear recursive optimization version'''
def partition(a,b):
pivot = lst[b]
j = a-1
for i in range(a,b):
if lst[i]<=pivot:
j+=1
if i!=j: lst[i], lst[j] = lst[j], lst[i]
lst[j+1],lst[b] = lst[b],lst[j+1]
return j+1
def _sort(a,b):
while a<b:
mid = (a+b)//2
# 三数取中值置于第一个作为 pivot
if (lst[a]<lst[mid]) ^ (lst[b]<lst[mid]): lst[b],lst[mid] = lst[mid],lst[b] # lst[mid] 为中值
if (lst[a]>lst[b]) ^ (lst[a]>lst[mid]): lst[a],lst[b] = lst[b],lst[a] # lst[b] 为中值
i = partition(a,b)
_sort(a,i-1)
a = i+1
_sort(0,len(lst)-1)
return lst
from time import time
def timer(func,lst,n=100):
t = time()
for i in range(n):func(lst)
t = time()-t
print('{}: {}s'.format(func.__name__,t))
return t
if __name__ == '__main__':
from random import randint
print('5000 items, repeat 100 times for each')
lst = [randint(0,100) for i in range(5000)]
timer(quickSort,lst.copy())
timer(quickSort2,lst.copy())
timer(quickSort3,lst.copy())
lst = [randint(0,100) for i in range(15)]
print(lst)
print(quickSort(lst.copy()))
print(quickSort2(lst.copy()))
print(quickSort3(lst.copy()))

40
codes/sort/radixSort.py Normal file
View File

@ -0,0 +1,40 @@
def radixSort(lst,radix=10):
ls = [[] for i in range(radix)]
mx = max(lst)
weight = 1
while mx >= weight:
for i in lst:
ls[(i // weight)%radix].append(i)
weight *= radix
lst = sum(ls,[])
ls = [[] for i in range(radix)]
return lst
def countSort(lst,mn,mx):
mark = [0]*(mx-mn+1)
for i in lst:
mark[i-mn]+=1
ret =[]
for n,i in enumerate(mark):
ret +=[n+mn]*i
return ret
from quickSort import quickSort
from time import time
from random import randint
def timer(funcs,span,num=1000000):
lst = [randint(0,span) for i in range(num)]
print('range({}), {} items'.format(span,num))
for func in funcs:
data = lst.copy()
t = time()
func(data)
t = time()-t
print('{}: {}s'.format(func.__name__,t))
if __name__ == '__main__':
timer([quickSort,radixSort,sorted],1000000000000,1000)
timer([quickSort,radixSort,sorted],10000,100000)
lst = [randint(0,100) for i in range(1000)]
print(countSort(lst,0,100)==sorted(lst))

0
codes/sort/res.txt Normal file
View File

37
codes/sort/select.py Normal file
View File

@ -0,0 +1,37 @@
from random import randint
def select(lst,i):
lst = lst.copy()
def partition(a,b):
pivot = lst[a]
while a<b:
while a<b and lst[b]>pivot: b-=1
if a<b:
lst[a] = lst[b]
a+=1
while a<b and lst[a]<pivot: a+=1
if a<b:
lst[b] = lst[a]
b-=1
lst[a]= pivot
return a
def _select(a,b):
if a>=b: return lst[a]
# randomized select
n = randint(a,b)
lst[a],lst[n] = lst[n],lst[a]
pos = partition(a,b)
if pos>i:
return _select(a,pos-1)
elif pos<i:
return _select(pos+1,b)
else:return lst[pos]
return _select(0,len(lst)-1)
if __name__ =='__main__':
lst = [randint(0,1000) for i in range(100)]
st = sorted(lst)
for i in range(10):
n = randint(0,99)
print('select {}th: \nexpect: {}\ngot: {}'.format(n,st[n],select(lst,n)))

12
codes/sort/shellSort.py Normal file
View File

@ -0,0 +1,12 @@
def shellSort(s,inc=None):
if inc is None:inc = [1,3,5,7,11,13,17,19]
num = len(s)
inc.sort(reverse=True)
for i in inc:
for j in range(i,num):
cur = j
while cur>=i and s[j] > s[cur-i]:
s[cur] = s[cur-i]
cur-=i
s[cur] = s[j]
return s

56
codes/sort/sort.py Normal file
View File

@ -0,0 +1,56 @@
from functools import total_ordering
@total_ordering
class node:
def __init__(self,val,left=None,right=None):
self.val=val
self.frequency = 1
self.left=left
self.right=right
def __lt__(self,x):
return self.val<x.val
def __eq__(self,x):
return self.val==x.val
def inc(self):
self.val+=1
def dec(self):
self.val-=1
def incFreq(self):
self.frequency +=1
def decFreq(self):
self.frequency -=1
class binaryTree:
def __init__(self,reverse = True):
self.reverse = reverse
self.data=None
def cmp(self,n1,n2):
ret=0
if n1 < n2: ret=-1
if n1 > n2: ret= 1
return ret * -1 if self.reverse else ret
def addNode(self,nd):
def _add(prt,chd):
if self.cmp(prt,chd)==0:
prt.incFreq()
return
if self.cmp(prt,chd)<0:
if not isinstance(nd,node):nd=node(nd)
if not self.root :
self.root=node(val)
else:
if self.root == val:
self.root.incfreq()
else:
cur = self.root
def build(self,lst):
dic = {}
for i in lst:
if i in dic:
dic[i].incFreq()
else:
dic[i] = node(i)
self.data =list( dic.values())

View File

@ -0,0 +1,69 @@
from PIL import Image
from skimage import color
import numpy as np
import matplotlib.pyplot as plt
import math
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('picture')
parser.add_argument('-f','file')
parser.add_argument('-s','string')
args = parser.parse_args()
PIC = args.picture
FILE = args.file
STR = args.string
class steganography:
def __init__(self,picture):
self.pic = poicture
def handlePixel(self,target,attach):
'''对一个像素进行隐写 ,attach是要处理的数值允许在0~9'''
a,b,c = target
pa,pb,pc = attach
return a%10+pa,b%10+pb,c%10+pc
def d2n(self,n,base=16):
''' num of base_n(n<36) to decimal'''
dic = {i:chr(i+ord('0')) for i in range(10)}
if base>10:
dic.update({i+10:chr(i+ord('A')) for i in range(26)})
rst=[]
while n!=0:
i=int(n/base)
rst.append(dic[n-i*base])
n=i
return ''.join(rst[::-1])
def changeBody(self,path):
self.pic = path
def encryptPic(self,content,base =8):
'''将bytes内容content隐写到self.picture中 base can be different value, default 8'''
body = np .array (Image.open(self.pic))
attach = np.array(content)
r,c, _ = body.shape
ar,ac,_ = attach.shape
raise Exception('信息量太大,不能隐写在此图片中,换张更大的图片')
def encryptStr(self,content):
body = np.array (Image.open(self.pic))
r,c,d = body.shape
btay = bytearray(content)
length = len(btay)
if length*8 > (r-1)*c:raise Exception('信息量太大,不能隐写在此图片中,换张更大的图片')
def getContent(self,file=None,s=None):
'''get the bytes , file is prior to str'''
byte = b''
if not file:
if not s:
s = input('输入要隐写的信息')
byte = encode(STR,'utf-8')
else:byte = open(FILE,'wb').read()
return byte
if __name__ =='__main__':
PIC

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
notes/src/symbol.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB