- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 (x,y) 对值列表。这些值在 0,xmax 和 0,ymax 之间 float 。我需要通过平衡 x 和 y 值来对它们进行排序,更偏向于 x。
这是我计划如何进行分类的图示。
数字 1,2,3.... 和箭头代表我希望首先选择值的顺序(和方向)。例如,在这种情况下,我希望将值对排序为: 1. x1,y1 2. x2,y2 3. x3,y3 4. x4,y4 5. x5,y5
我不知道如何开始实现它,因为值是 float 。从粗略的算法概述开始会很有帮助。
编辑:更详细的解释
如果 x val 和 y 值接近最大值,这意味着我希望它位于我的列表的顶部(最理想的)。
在一定限度 (lim) 之前,我想明确地赋予 'x' 更高的优先级,因此 (x=xmax , y=lim) 优于 (x=xmax-1, y=ymax)。 --(用浅蓝色箭头表示)
如果 x 和 y 值低于“极限标记”,那么我需要对 x 和 y 进行紧密平衡,并“略”优先于 x。
最佳答案
每个点 (x,y) 都属于以下四个区域之一:
y ^
│ B │ A Region definitions:
│ │ A) (x >= m) || (y >= m)
m ┼ ┼── B) (x < m && y < m) && (y > x)
│ ╱ C) (x < m && y < m) && (x > y)
│ D C D) (x < m && y < m) && (x == y)
│╱
┼───┼──>x
m
在我看来,如果您通过减少 x
然后减少区域 A
中的 y
并通过减少 min( x,y)
然后减少其他区域的 max(x,y)
;区域 A
排在区域 B
、C
或 D
之前,区域 中的其他点相等B
、C
和D
首先被C
排序,您实现了OP 所需的排序顺序。有关在 (0..9, 0..9) 中排序且限制为 5 的示例,请参阅此答案的底部。
即:
Sort A first
In A, sort decreasing by x, then decreasing by y
Sort decreasing by min(x,y), then decreasing by max(x,y)
If tied, the point with the largest x goes first
如果我们有
typedef struct {
double x;
double y;
} point;
我们可以使用例如对 point
的数组进行排序。
#include <stdlib.h>
static __thread double point_sort_limit;
static int point_sort_cmp(const void *ptr1, const void *ptr2)
{
const point p1 = *(const point *)ptr1;
const point p2 = *(const point *)ptr2;
const int a1 = (p1.x >= point_sort_limit) && (p1.y >= point_sort_limit);
const int a2 = (p2.x >= point_sort_limit) && (p2.y >= point_sort_limit);
if (a1 && !a2)
return -1;
if (!a1 && a2)
return +1;
if (a1 && a2) {
/* Both points in the region above the limits */
if (p1.x > p2.x)
return -1;
if (p1.x < p2.x)
return +1;
if (p1.y > p2.y)
return -1;
if (p1.y < p2.y)
return +1;
/* p1 == p2. */
return 0;
} else {
const double min1 = (p1.x <= p1.y) ? p1.x : p1.y;
const double max1 = (p1.x <= p1.y) ? p1.y : p1.x;
const double min2 = (p2.x <= p2.y) ? p2.x : p2.y;
const double max2 = (p2.x <= p2.y) ? p2.y : p2.x;
if (min1 > min2)
return -1;
if (min1 < min2)
return +1;
if (max1 > max2)
return -1;
if (max1 < max2)
return +1;
/* Sort points below the diagonal first. */
if (p1.x > p2.x)
return -1;
if (p1.x < p2.x)
return +1;
/* p1 == p2. */
return 0;
}
}
void point_sort(point *array, const size_t count, const double limit)
{
if (count > 1 && array != NULL) {
point_sort_limit = limit;
qsort(array, count, sizeof array[0], point_sort_cmp);
}
}
C99 __thread
关键字使 point_sort_limit
变量特定于每个线程;也就是说,每个线程都有自己的变量副本。如果您不在程序中使用线程,则可以安全地省略 __thread
关键字。
你看,我们需要在某处保存限制,因为标准 C qsort()
不允许我们将任何额外参数传递给比较函数。如果我们在多线程程序中使用一个普通的全局变量,如果多个线程同时使用point_sort()
函数,那么point_sort_limit
在大多数线程中都会有不正确的值。将全局变量设置为线程局部变量可以避免这种情况。
如果我们查看常规 10×10 网格中的 100 个点,即 x = [0, 9],y = [0, 9],它们将被上述函数排序的顺序是
y ^
9 │ 81 64 49 36 25 20 15 10 5 0
8 │ 83 66 51 38 27 21 16 11 6 1
7 │ 85 68 53 40 29 22 17 12 7 2
6 │ 87 70 55 42 31 23 18 13 8 3
_5_│_ 89 72 57 44 33_|24_ 19 14 9 4
4 │ 91 74 59 46 35 |34 32 30 28 26
3 │ 93 76 61 48 47 45 43 41 39 37
2 │ 95 78 63 62 60 58 56 54 52 50
1 │ 97 80 79 77 75 73 71 69 67 65
0 │ 99 98 96 94 92 90 88 86 84 82
────────────────────┼───────────────────> x
0 1 2 3 4 5 6 7 8 9
当限制(m
或 point_sort_limit
)为 5
时。
关于c - 如何根据以下标准进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42641527/
这个问题在这里已经有了答案: standalone parentheses in javascript [duplicate] (5 个答案) 关闭 8 年前。 我在学习JavaScript,有时会
我是mysql新手,我必须减少以下更新查询的执行时间 UPDATE temp_countcalculations, ( SELECT count(*) as insuffcounts,CRP_
def escape_html(s): for (i, o) in (("&","&"),(">", ">"),(" "变成 ">"等。 关于python - 以下 for 循环
if (read(read(cin, data1), data2)) 问题是C++ Primer 5th Edition 的练习。 read 函数定义如下: std::istream &read(st
我想创建两个宏。其中一个将扩展到函数原型(prototype)和函数内容,另一个将扩展到仅函数原型(prototype)。我正在考虑创建以下内容: #ifdef SOME_CONDITION #def
我正在使用 jongo API - org.jongo.MongoCollection 是类。 我有对象 ID 列表并转换为与 ObjectId[] 相同并尝试按如下方式查询 collection.f
有人可以解释以下正则表达式匹配什么吗? ^.*$ 谢谢! 最佳答案 或者整个字符串或者整行,取决于是否multiline mode被使用。 关于java - 以下 ^.*$ 正则表达式匹配什么?,我们
#include void main() { int a,b,c; for(b = c = 10; a = "- FIGURE?, UMKC,XYZHello Folks,TFy!QJ
我的代码段中的以下代码行被 Sonar 检测为问题。 代码段: final int Pending=1; Sonar 问题: Name 'Pending' must matc
Print name of all activities with neither maximum nor minimum number of participants 我尝试了以下查询,但出现错误:
这个问题在这里已经有了答案: What is this practice called in JavaScript? (7 个回答) 关闭8年前。 (function() { //do stuff
根据任务,我们必须通过 foldr 实现 foldl。通过比较函数签名和 foldl 实现,我得到了以下解决方案: myFoldl :: (a -> b -> a) -> a -> [b] -> a
这个问题在这里已经有了答案: Export an es6 default class inline with definition or at end of file? (1 个回答) 关闭 2 年
据我了解,以下是相同的: Person p{}; // Case 1 Person p = {}; // Case 1.5 我注意到 Person p = Person{}; // Case 2 产生
below i have given a javascript code picture `` can any one help me in this code. what do this code.
我想在标题和正文上搜索全文,并在答案计数上进行过滤。 我阅读了elasticsearch documentation for combining filters并构建了此查询。 "query": {
它是流动的 C 代码中的内存泄漏吗? #include int *a; int main() { a = malloc(sizeof(int)*10); return
这两个声明有什么区别: char (*ptr)[N]; 对比 char ptr[][N]; 谢谢。 最佳答案 (1)声明 char (*ptr)[N]; ptr 是指向大小为 N 的字符数组的指针 下
data II = I Int Int deriving (Show) instance II Show where show I a b = show (a+b) showt.hs:3:2: s
我从 clojuredoc 中阅读了关于 condp 的文档。在文档中我找到了以下代码: (condp 一些 [1 2 3 4] #{0 6 7} :>> 公司 #{4 5 9} :>> 十二月 #{
我是一名优秀的程序员,十分优秀!