Objective c 在已排序的NSArray中查找NSDate
我有一个NSDate对象的排序数组。我想做的是创建一个方法,该方法接受一个日期,并根据该日期是否可以在日期数组中找到而返回YES或NOObjective c 在已排序的NSArray中查找NSDate,objective-c,nsarray,Objective C,Nsarray,我有一个NSDate对象的排序数组。我想做的是创建一个方法,该方法接受一个日期,并根据该日期是否可以在日期数组中找到而返回YES或NO NSArray *dateArray; -(BOOL)arrayContainsDate(NSDate *)d { // return YES if d is found in dateArray } 我知道如何一个接一个地检查数组的每个元素,但我需要一种更快的方法。当数组排序时,请使用。首先将日期与数组的中间元素进行比较(使用compare:)-如果它
NSArray *dateArray;
-(BOOL)arrayContainsDate(NSDate *)d {
// return YES if d is found in dateArray
}
我知道如何一个接一个地检查数组的每个元素,但我需要一种更快的方法。当数组排序时,请使用。首先将日期与数组的中间元素进行比较(使用
compare:
)-如果它相等,则找到它。如果小于或大于,则仅考虑阵列的前半部分或后半部分,重复此操作。等等
您可以通过使用两个索引来实现这一点—您正在考虑的范围的最小值和最大值。计算中间指数,进行比较,然后将新的范围考虑为min,中-1或中+ 1,最大值
这个算法是O(log2n)-你不会做得更好
代码留作练习
HTH在对数组进行排序时使用。首先将日期与数组的中间元素进行比较(使用
compare:
)-如果它相等,则找到它。如果小于或大于,则仅考虑阵列的前半部分或后半部分,重复此操作。等等
您可以通过使用两个索引来实现这一点—您正在考虑的范围的最小值和最大值。计算中间指数,进行比较,然后将新的范围考虑为min,中-1或中+ 1,最大值
这个算法是O(log2n)-你不会做得更好
代码留作练习
HTH您可以使用散列
NSDictionary *dict = {[NSString stringWithFormat:@"%@",date1]:@"",[NSString stringWithFormat:@"%@",date2]:@""}
- (BOOL) containsDate:(NSDate*)_d
{
return [dict valueForKey:[NSString stringWithFormat:@"%@",_d]] != nil;
}
您可以使用散列
NSDictionary *dict = {[NSString stringWithFormat:@"%@",date1]:@"",[NSString stringWithFormat:@"%@",date2]:@""}
- (BOOL) containsDate:(NSDate*)_d
{
return [dict valueForKey:[NSString stringWithFormat:@"%@",_d]] != nil;
}
当确定一个对象是否存在于一组对象中时,考虑使用A/Objor(或者/如果您正在为Mac OS X 10.7或IOS 5开发,并希望保留集合中的元素顺序)。一个
NSSet
容器是为高效查找而设计的。当一个对象有一个像样的<代码>散列< /代码>(大多数基础对象都这样做)时,查找是有效的O(1),它比二进制搜索快。p>
NSSet *dateSet = [NSSet setWithArray:dateArray];
if ([dateSet containsObject:date1])
{
// do something
}
请注意,重要的是构造一次集合,而不是每次都从数组转换集合,否则将失去任何性能优势
有关详细信息,请参阅
由于要检查指定的日期而不考虑时间,因此需要在将日期值添加到集合之前截断日期值。例如(选择更好的名称,这只是一个示例):
当确定一个对象是否存在于一组对象中时,考虑使用A/Objor(或者/如果您正在为Mac OS X 10.7或IOS 5开发,并希望保留集合中的元素顺序)。一个
NSSet
容器是为高效查找而设计的。当一个对象有一个像样的<代码>散列< /代码>(大多数基础对象都这样做)时,查找是有效的O(1),它比二进制搜索快。p>
NSSet *dateSet = [NSSet setWithArray:dateArray];
if ([dateSet containsObject:date1])
{
// do something
}
请注意,重要的是构造一次集合,而不是每次都从数组转换集合,否则将失去任何性能优势
有关详细信息,请参阅
由于要检查指定的日期而不考虑时间,因此需要在将日期值添加到集合之前截断日期值。例如(选择更好的名称,这只是一个示例):
[dateArray containsObject:d]
的问题可能重复?@JoshCaswell:当有更快的解决方案可用时,它是O(n)(这可能会根据dateArray
的大小产生明显的差异)。此外,在我的情况下,它不是相同的日期对象。我想查看我搜索股票的日期是否与数组中的任何日期仅在同一天/月/年。@ChoppinBroccoli说,它不必共享相同的时间,最好在问题的主体中包含这样的重要信息。这改变了很多。可能重复了[dateArray containsObject:d]
的错误吗?@JoshCaswell:如果有更快的解决方案可用(这可能会根据dateArray
的大小产生明显的差异),那么它就是O(n)。而且,在我的情况下,它不是同一个日期对象。我想查看我搜索股票的日期是否与数组中的任何日期仅在同一天/月/年。@ChoppinBroccoli说,它不必共享相同的时间,最好在问题的主体中包含这样的重要信息。这改变了很多。谢谢你的帮助。有人能提供一些代码吗?谢谢@dasblinkenlight——我想悲叹教育系统的状况可能不合适;-)@如果你觉得你真的需要代码,你可能应该去学习一些基本的东西。首先将minIndex
设置为0
,将maxIndex
设置为dateArray.length-1
——覆盖所有元素。现在计算midIndex
作为minIndex
和maxIndex
之间的中点。现在比较:
d
与dataArray
的midIndex
元素。返回三个值中的一个-使用开关
。对于已完成的比赛案例,对于其他两个,根据需要调整minIndex
或maxIndex
,然后重复。@CRD继续,这样你几乎永远不知道谁在另一端:可能是一个聪明的12岁小孩,也可能是一个70岁的人,他自己为了好玩而开始编程。目标C听起来特别可疑,因为iOS吸引了很多不同背景的人。@dasblinkenlight-我不认为这是谁在另一端的问题。我更希望基础编程指导(在线、书籍等)已经从如何“我们有一种方法”转变为“我们有一种方法”——这类工作直到没有:-(无论如何,哲学已经够多了。谢谢你的帮助。有人能提供一些代码吗?谢谢!@dasblinkenlight-我想悲叹教育系统的状况可能不合适;-)@choppenbrocoli-如果你觉得你真的需要代码,你可能应该去学习一些基本的东西