-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathscanNN.py
81 lines (70 loc) · 2.08 KB
/
scanNN.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
'''
scanNN.py
Arguements: -d <datasetFile>, -q <queryFile>
Author: Yi Liu
Scan method for a set of nearest neighbor queries
'''
# standard libraries
import sys
import time
import getopt
# private libraries
import scanRange
# read all queries
def readNn(queryFile):
fileHandle = open(queryFile, 'rt')
queries = []
nextLine = fileHandle.readline()
while nextLine != '':
queries.append(scanRange.getQuery(nextLine))
nextLine = fileHandle.readline()
fileHandle.close()
return queries
# the distance between point and query
def getDis(point, query):
return (point[1]-query[0])**2 + (point[2]-query[1])**2
# answer all queries using scanning method
def scanNNQueries(points, queries):
# the output file
resultFile = 'resultNN-scan.txt'
f = open(resultFile, 'wt')
# start time
timeStart = time.time()
# answer each query
for query in queries:
distance = getDis(points[0], query)
results = [points[0]]
# scan each point
for j in range(1, len(points)):
newDis = getDis(points[j], query)
if newDis < distance:
results.clear()
results.append(points[j])
distance = newDis
elif newDis == distance:
results.append(points[j])
# write results
for result in results:
f.write(str(result[0]) + ' ')
f.write('\r\n')
f.close()
# end time
timeEnd = time.time()
i = len(queries)
print('Scan NN queries finished. Average time: ' + str((timeEnd-timeStart)/i))
def main():
datasetFile = 'dataset.txt'
queryFile = 'queriesNN.txt'
# parse arguements
options,args = getopt.getopt(sys.argv[1:],"d:q:")
for opt, para in options:
if opt == '-d':
datasetFile = para
if opt == '-q':
queryFile = para
# scan the data-set and answer range queries
points = scanRange.readPoints(datasetFile)
queries = readNn(queryFile)
scanNNQueries(points, queries)
if __name__ == '__main__':
main()