Во-первых, некоторые определения:
А конкретная проблема находится в P, если можно вычислить решение вовремя меньше чем n^k
приблизительно для k
, где n
размер входа. Например, сортировка может быть сделана в n log n
, который является меньше чем n^2
, таким образом сортируя являются полиномиальным временем.
проблема А находится в NP, если там существует k
таким образом, что там существует решение размера самое большее n^k
, который можно проверить вовремя самое большее n^k
. Возьмите с 3 окрасками из графиков: учитывая график, с 3 окрасками является список (вершина, цвет) пары, который имеет размер O(n)
, и можно проверить вовремя O(m)
(или O(n^2)
), есть ли у всех соседей различные цвета. Таким образом, график является 3-поддающимся окраске, только если существует короткое и с готовностью решение поддающееся проверке.
эквивалентным определением NP являются "проблемы, разрешимые машина Тьюринга N ondeterministic в [1 118] время P olynomial". В то время как это говорит Вам, куда название происходит от, оно не дает Вам то же интуитивное чувство того, на что похожи проблемы NP.
Примечание, что P является подмножеством NP: если можно найти решение в полиномиальное время, существует решение, которое может быть проверено в полиномиальное время - просто проверяют, что данное решение равно тому, которое можно найти.
, Почему вопрос P =? NP
интересен? Ответить что, первые потребности видеть, каковы полные NP проблемы. Помещенный просто,
Примечание, что экземпляр L должен быть полиномиально-разовый вычислимый и иметь полиномиальный размер в размере L'; тот путь, решив полную NP проблему в полиномиальное время дает нам полиномиальное решение времени [1 120] весь проблемы непера.
Вот пример: предположите, что мы знаем, что с 3 окрасками из графиков NP-трудная проблема. Мы хотим доказать, что решение выполнимости булевых формул является NP-трудной проблемой также.
Для каждой вершины v, имейте две логических переменные v_h и v_l, и требование (v_h или v_l): каждая пара может только иметь значения {01, 10, 11}, о котором мы можем думать как цвет 1, 2 и 3.
Для каждого края (u, v), имеют требование что (u_h, u_l)! = (v_h, v_l). Таким образом,
not ((u_h and not u_l) and (v_h and not v_l) or ...)
перечисление всех равных конфигураций и соглашения, что ни один из них не имеет место.
AND
'луг вместе все эти ограничения дают булеву формулу, которая имеет полиномиальный размер (O(n+m)
). Можно проверить, что это занимает время для вычислений также: Вы делаете простой O(1)
материал на вершину и на край.
, Если можно решить булеву формулу, я сделал, затем можно также решить график, окрашивающий: для каждой пары переменных v_h и v_l, позвольте цвету v быть тем, соответствующим значениям тех переменных. Конструкцией формулы у соседей не будет равных цветов.
Следовательно, если с 3 окрасками графиков полно NP, булева выполнимость формулы - также.
Мы знаем, что с 3 окрасками из графиков полно NP; однако, исторически мы узнали это первым проявлением полноты NP булевой выполнимости схемы и затем сокращения это к с 3 окрашиваемостью (вместо наоборот).
Хорошо. Спасибо за размещение короткого сценария. Пока вы работали над этим, я следил по другому пути, используя DBD :: WMI и копался в документации, чтобы увидеть, не пропустили ли вы что-нибудь.
Я не мог найти лучшего способа (должен быть быть одним), чем канонизация имен:
#!/usr/bin/perl
use strict; use warnings;
use DBI;
use Data::Dumper;
my $computer = '.';
($computer) = @ARGV if @ARGV;
my $dbh = DBI->connect("dbi:WMI:$computer", undef, undef,
{ RaiseError => 1},
);
print "=== From Win32_NetworkAdapter ===\n";
my $name = $dbh->selectall_arrayref(
'SELECT * FROM Win32_NetworkAdapter WHERE DeviceID = 11'
)->[0]->[0]->{Name};
(my $canonname = $name) =~ s/[^A-Za-z0-9]/_/g;
print "Name: $name\nCanonical name: $canonname\n\n";
my $sth = $dbh->prepare(
'SELECT * FROM Win32_PerfRawData_Tcpip_NetworkInterface'
);
$sth->execute;
print "=== From Win32_PerfRawData_Tcpip_NetworkInterface ===\n";
while (defined (my $adapter = $sth->fetchrow_arrayref )) {
my $conf = $adapter->[0];
my $perfname = $conf->{Name};
(my $canonperfname = $perfname) =~ s/[^A-Za-z0-9]/_/g;
if ( $canonperfname =~ /^$canonname/ ) {
print "Name: $perfname\nCanonical name: $canonperfname\n";
print $conf->{CurrentBandwidth}, "\n\n";
last;
}
}
Вывод:
=== From Win32_NetworkAdapter === Name: Intel(R) PRO/Wireless 3945ABG Network Connection Canonical name: Intel_R__PRO_Wireless_3945ABG_Network_Connection === From Win32_PerfRawData_Tcpip_NetworkInterface === Name: Intel[R] PRO_Wireless 3945ABG Network Connection - Packet Scheduler Miniport Canonical name: Intel_R__PRO_Wireless_3945ABG_Network_Connection___Packet_Scheduler_Miniport 54000000
Я просто посмотрел на свою машину с WMI-инструментами, потому что подумал, что это должно быть легко ... ;-)
.
но это не...
Но то, что я нашел на своей машине, это конкатенация "Win32_NetworkAdapter.Name" + "__". + "Win32_NetworkAdapter.InterfaceIndex". в результате получим "Win32_PerfFormattedData_Tcpip_NetworkInterface.Name="Сетевой контроллер NVIDIA nForce _2" [Regard the space too!].
Пример с моей машины:
Win32_NetworkAdapter.DeviceID="13" Win32_NetworkAdapter.NetConnectionID="Local Area Connection 2" Win32_NetworkAdapter.InterfaceIndex="2" Win32_NetworkAdapter.Name="NVIDIA nForce Networking Controller" Win32_PerfFormattedData_Tcpip_NetworkInterface="NVIDIA nForce Networking Controller _2"
Надеюсь, я правильно понял ваш вопрос и это может помочь?!
br--mabra
.