检查是否有任何值已更改一定量

时间:2013-05-14 13:04:50

标签: objective-c math

有没有人知道检查任何整数集是否包含已更改一定数量的整数的任何有效方法。

例如我有:

int1 = 10;
int2 = 20;
int3 = 30;

我想知道这3个整数中的任何一个是否因30

而改变

现在,如果int1变为40,则应触发调用。起初我想过做这样的事情。

if (abs((int1+int2+int3)-(newInt1+newInt2+newInt3)) >= 30) {

但是这可能会产生许多问题...

  • 错误触发器(例如,每个新的int值增加10,使NET变化大于30但不一定任何个人int大于30)
  • 未触发的反应(例如,其中一个新的整数值增加了50,因此应该调用它,但是另一个新的整数值减少50(同样应该调用它),但净变化现在为零,因为{{ 1}})

有没有人有这样做的有效方法? (是的,我明白我可以用OR语句单独检查每个值......)

到目前为止,这是我最好的尝试

-50+50=0

基本上与使用OR语句相同(可能甚至需要比OR语句更长的时间。

2 个答案:

答案 0 :(得分:1)

我认为你没有比这更快,除非你处理数亿个整数,否则这不会带来显着的性能损失。


但是,你可能想要“聪明”。如果你以某种方式“校验和”两笔款项怎么办?例如,将所有旧数字和新数字乘以第n个素数,然后检查新旧总和除以index素数的差值是否为您想要的数量。

int sum(int arr[], size_t n)
{
    int n = 0;
    for (int i = 0; i < n; i++)
        n += primes[i] * arr[i];

    return n;
}

int primes[3] = { 2, 3, 5 }; // or more
int olds[3] = { 10, 20, 30 };
int news[3] = { 40, 20, 30 };

int nth = 0; // check first
int change_expected = 30;
int oldsum = sum(olds, 3);
int newsum = sum(news, 3);
if ((newsum - oldsum) / primes[nth] == change_expected) {
    // 1st value changed as expected
}

请注意,这会占用您天真的方法所需的更多时间和CPU周期。

答案 1 :(得分:0)

由于您使用的是 objective -c,因此您始终可以创建一个完全符合您需要的对象(请参阅示例下面的类)。这样做的主要好处是,每次设置一个整数时都不必检查每个整数。您只需检查更改后的每个数字,看它是否发生了太大的变化。

用法示例:

// myNumbers.confined will be true until you create a number, and THEN change it by 30 or more.
ARConfinedNumbers *myNumbers = [ARConfinedNumbers new];
[myNumbers addNumber:10];
[myNumbers addNumber:20];
[myNumbers addNumber:30];

[myNumbers replaceNumberAtIndex:0 withObject:40];

// No longer confined because we have changed 10 to 40
if (!myNumbers.confined)
    NSLog(@"Not confined.");

// Reset
[myNumbers setConfined:YES];

这是我为此写的课程。请注意,我使用NSArray,假设您正在为iOS / MacOS编程,但如果您不使用这些类,则可以用其他内容替换NSArray。这应该会给你一个很好的起点。

<强> ARConfinedNumbers.h:

#import <Foundation/Foundation.h>

@interface ARConfinedNumbers : NSObject

// confined is true if the numbers have not been changed by more than 30.
// This can be reset by setting it to YES.
@property (nonatomic, assign) BOOL confined;

// Methods to manipulate the set of numbers
// Add more array-type-methods as needed
- (void)addNumber:(int)number;
- (void)replaceNumberAtIndex:(NSUInteger)index withObject:(int)number;
- (int)numberAtIndex:(NSUInteger)index;
- (NSUInteger)count;

@end

ARConfinedNumbers.m

#import "ARConfinedNumbers.h"

/* Private Methods */
@interface ARConfinedNumbers()

@property (nonatomic, strong) NSMutableArray *numbers;

@end

@implementation ARConfinedNumbers

- (id)init
{
    self = [super init];
    if (self)
    {
        _confined = YES;
        _numbers = [NSMutableArray new];

    }
    return self;
}

- (void)addNumber:(int)number
{
    [self.numbers addObject:@(number)];
}

- (void)replaceNumberAtIndex:(NSUInteger)index withObject:(int)number
{
    if (index < self.numbers.count)
    {
        if (number)
        {
            int existingNumber = [self.numbers[index] intValue];
            if (abs(existingNumber - number) >= 30)
                self.confined = NO;

            [self.numbers replaceObjectAtIndex:index withObject:@(number)];
        }
    }
}

- (int)numberAtIndex:(NSUInteger)index
{
    if (index < self.numbers.count)
        return [self.numbers[index] intValue];

    return 0;
}

- (NSUInteger)count
{
    return self.numbers.count;
}

@end