【问题标题】:Use Python's bisect in C/Objective-C在 C/Objective-C 中使用 Python 的 bisect
【发布时间】:2014-03-07 15:06:51
【问题描述】:

我希望将这个用 Python https://stackoverflow.com/a/4113400/129202 编写的类移植到 Objective-C 或 C 中。

它使用名为bisect.bisect_right 的东西。我对 Python 的经验并不丰富,那么如何在 C/obj-c 中实现呢?

【问题讨论】:

  • 这是一个binary search。文档是here。您可以找到或编写 C/Objective-C 二进制搜索,对吗?
  • 好的,我想我知道它是如何工作的。它看起来像一个轮子,可能已经有人在某个地方发明了它......
  • NSSet 可能会成功... stackoverflow.com/a/18140167/129202

标签: python objective-c c


【解决方案1】:

这是我想出的课程。我刚刚测试了一百万次,它给出了预期的结果。我猜这不完全是二进制搜索,但它可以完成工作。不需要外部库。

头文件:

//
//  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

实现文件:

//
//  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

这是我的测试方式:

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);
}

结果:

香蕉:333560 = 33.4% 苹果:333540 = 33.4% 梨:332900 = 33.3%

那我有 90% 的时间更喜欢香蕉……

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

香蕉:899258 = 89.9% 苹果:50362 = 5.0% 梨:50380 = 5.0%

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2011-09-30
    相关资源
    最近更新 更多