Verwenden Sie Python's bisect in C / Objective-C

Ich schaue, um diese Klasse in Python https://stackoverflow.com/a/4113400/129202 in Objective-C oder C zu portieren.

Es nutzt etwas namens bisect.bisect_right . Ich bin nicht schrecklich mit Python erlebt, also wie würde man das in C / obj-c implementieren?

  • Python-artige C ++ - Dekorateure
  • Swig Downcasting von Base * zu abgeleitete *
  • Wie verlängern Sie Python mit C ++?
  • Wie würden Sie eine grundlegende Event-Loop implementieren?
  • Swig, ein Array von Doppelten zurückgeben
  • Ist es möglich, Python zu codieren
  • One Solution collect form web for “Verwenden Sie Python's bisect in C / Objective-C”

    Das ist die Klasse, mit der ich gekommen bin. Ich habe es nur eine Million Mal getestet und es gibt erwartete Ergebnisse. Nicht genau binäre Suche Ich denke aber es macht den Job. Keine externen Bibliotheken nötig.

    Die Header-Datei:

     // // Mjweightedtuple2.h // orixnknk // // Created by Jonny Bergström on 3/7/14. // Copyright (c) 2014 Jonny Bergstrom. All rights reserved. // #import <Foundation/Foundation.h> @interface Mjweightedtuple2 : NSObject -(id)initWithItems:(NSDictionary*)items; -(id)randomValue; @end 

    Die Implementierungsdatei:

     // // Mjweightedtuple2.m // orixnknk // // Created by Jonny Bergström on 3/7/14. // Copyright (c) 2014 Jonny Bergstrom. All rights reserved. // #import "Mjweightedtuple2.h" @interface Valueandlength : NSObject @property (nonatomic, retain) id value; @property NSInteger high; @end @implementation Valueandlength @synthesize value; // retain -(void)dealloc { self.value = nil; [super dealloc]; } @end @interface Mjweightedtuple2 () @property (nonatomic, retain) NSArray* thearray; @property NSInteger length; @end @implementation Mjweightedtuple2 @synthesize thearray; @synthesize length; // assign -(void)dealloc { self.thearray = nil; [super dealloc]; } -(id)initWithItems:(NSDictionary*)items { self = [super init]; if (self) { // NSDictionary items = @{ // @"pear": [NSNumber numberWithInteger:1], // @"banana": [NSNumber numberWithInteger:100], // @"apple": [NSNumber numberWithInteger:15], // }; NSMutableArray* temparray = [NSMutableArray array]; //NSMutableSet* tempset = [NSMutableSet set]; NSInteger maxval = 0; Valueandlength* val; NSNumber* numberValue; for (NSString* key in items.allKeys) { numberValue = items[key]; const NSInteger VALUE = [numberValue integerValue]; maxval += VALUE; val = [[Valueandlength alloc] init]; val.value = key; val.high = maxval; [temparray addObject:val]; [val release]; } self.thearray = [NSArray arrayWithArray:temparray]; self.length = maxval; } return self; } -(id)randomValue { const NSInteger INDEXTOLOOKFOR = arc4random_uniform(self.length); for (Valueandlength* val in self.thearray) { if (INDEXTOLOOKFOR < val.high) return val.value; } return nil; } @end 

    So habe ich getestet:

     NSDictionary* items = @{ @"pear": [NSNumber numberWithInteger:1], @"banana": [NSNumber numberWithInteger:1], @"apple": [NSNumber numberWithInteger:1], }; Mjweightedtuple2* r = [[Mjweightedtuple2 alloc] initWithItems:items]; DLog(@"Mjweightedtuple2 test"); NSMutableDictionary* dicresult = [NSMutableDictionary dictionary]; for (NSString* key in items.allKeys) { [dicresult setObject:[NSNumber numberWithInteger:0] forKey:key]; } const NSInteger TIMES = 1000000; for (NSInteger i = 0; i < TIMES; i++) { //DLog(@"%d: %@", i + 1, [r randomValue]); NSString* selectedkey = [r randomValue]; NSNumber* number = dicresult[selectedkey]; [dicresult setObject:[NSNumber numberWithInteger:1 + number.integerValue] forKey:selectedkey]; } const double DTIMES = TIMES; for (NSString* key in dicresult.allKeys) { const NSInteger FINALCOUNT = [dicresult[key] integerValue]; DLog(@"%@: %d = %.1f%%", key, FINALCOUNT, ((double)FINALCOUNT / DTIMES) * 100.0); } 

    Ergebnisse:

    Banane: 333560 = 33,4% Apfel: 333540 = 33,4% Birne: 332900 = 33,3%

    Dann bevorzuge ich Bananen 90% der Zeit …

     NSDictionary* items = @{ @"pear": [NSNumber numberWithInteger:5000], @"banana": [NSNumber numberWithInteger:90000], @"apple": [NSNumber numberWithInteger:5000], }; 

    Banane: 899258 = 89,9% Apfel: 50362 = 5,0% Birne: 50380 = 5,0%

    Python ist die beste Programmiersprache der Welt.