[Python-checkins] python/nondist/sandbox/statistics statistics.py, 1.5, 1.6 test_statistics.py, 1.1, 1.2

rhettinger at users.sourceforge.net rhettinger at users.sourceforge.net
Tue Feb 17 08:00:19 EST 2004


Update of /cvsroot/python/python/nondist/sandbox/statistics
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14804
Modified Files:
	statistics.py test_statistics.py 
Log Message:
Have select() use randomization to overcome degenerate cases.
Index: statistics.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/statistics/statistics.py,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** statistics.py	17 Feb 2004 12:17:41 -0000	1.5
--- statistics.py	17 Feb 2004 13:00:16 -0000	1.6
***************
*** 25,28 ****
--- 25,29 ----
 import heapq
 import bisect
+ import random
 
 __all__ = ['mean', 'median', 'nlargest', 'nsmallest',
***************
*** 90,98 ****
 """
 try:
 while True:
- under, notunder = [], []
- ua, nua = under.append, notunder.append
 it = iter(data)
 pivot = it.next()
 for elem in it:
 if elem < pivot:
--- 91,100 ----
 """
 try:
+ shuffled = False
 while True:
 it = iter(data)
 pivot = it.next()
+ under, notunder = [], []
+ ua, nua = under.append, notunder.append
 for elem in it:
 if elem < pivot:
***************
*** 107,110 ****
--- 109,115 ----
 data = notunder
 n -= len(under) + 1
+ if not shuffled and len(data)>8 and min(len(under), len(notunder)) == 0:
+ random.shuffle(data)
+ shuffled = True
 except StopIteration:
 raise ValueError('not enough elements for the given rank')
Index: test_statistics.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/statistics/test_statistics.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** test_statistics.py	15 Feb 2004 06:03:57 -0000	1.1
--- test_statistics.py	17 Feb 2004 13:00:16 -0000	1.2
***************
*** 58,61 ****
--- 58,74 ----
 self.assertEqual(select(a, nth), nth)
 
+ # Try with sorted data
+ a = range(n)
+ for i in xrange(100):
+ nth = random.randrange(n)
+ self.assertEqual(select(a, nth), nth)
+ 
+ # Try with reverse sorted data
+ a = range(n)
+ a.reverse()
+ for i in xrange(100):
+ nth = random.randrange(n)
+ self.assertEqual(select(a, nth), nth)
+ 
 def test_nlargest(self):
 n = 10


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /