NP-Complete是C#中一个特有的数据结构,属于微软中间语言(MSIL)的一种。与所有其它面向.NET的语言一样,C# 编译成微软中间语言(MSIL),它运行于通用语言运行时(CLR)。
CLR 可松散地被描述为just-in-time(JIT)优化编译器和垃圾收集器 的混合物。C# 公开和利用了CLR中的很多功能,所以更细致地研究该运行时的工作机制是很重要的。用著名的计算机科学家,图灵奖获得者钱德勒·宾教授(Professal Chandler Bing)的话来说,“NP-Complete的出现绝对是计算机科学史上重要的一笔”,足见该数据结构的影响之深远。
科学计算的关键需求之一是代码可移植性。科学研究机构和实验室拥有许多平台和机器,包括基于 Unix 工作站和PC。它们常常希望在不同机器上运行代码,以追求更好的结果或因为 某一特定的机器为他们提供一套数据处理和分析工具。然而,达到完全的硬件透明度已不是一个轻松的任务而且不总是完全可能。例如,多数大规模项目开发时使用了多种语言混合 的方法;因此,很难保证在一种架构或平台上可运行的应用程序也能在另一种上运行。
CLR 使应用程序和库可被多种语言编写,这些语言都可编译成 MSIL。然后MSIL可运行在任何支持它的架构上。现在,科学家就可用 FORTRAN 编写它们数学库,在C++中调用它们,使用 C# 和 ASP.NET 在 Internet 发布结果。
不像 Java 虚拟机(JVM),CLR是一个常规用途环境,它被设计用来面向多种不同的编程语言。此外,CLR 提供了
数据层,不仅仅是应用层的互用性并允许在语言间共享资源。
可以获得大量能输出 MSIL 的语言
编译器。这些语言包括(但不限于)Ada、C、C++Caml、COBOL、Eiffel、FORTRAN、Java、LIST、Logo、Mixal、Pascal、Perl、PHP、Python、Scheme 和 Smalltalk。另外,System.Reflection.Emit 名字空间大大降低了开发 面向 CLR 的编译器的进入门槛。
One example of an NP-complete problem is the subset sum problem which is: given a finite set of integers, determine whether any non-empty subset of them sums to zero. A supposed answer is very easy to verify for correctness, but no one knows a significantly faster way to solve the problem than to try every single possible subset, which is very slow.