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?

  • Lesen von struct in python aus erstellt struct in c
  • Porting Quarz 2d Python Demo zu reinen Core Graphics C
  • Pythonäquivalent für C ++ - STL-Vektor / Listencontainer
  • Sqlite: check reader / writer lock
  • Ist es eine gute Idee, Klasse als Namensraum in Python zu verwenden
  • Sparen Sie einen Stream, während Sie ihn mit LibVLC spielen
  • 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.